最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java調(diào)用C++程序的實(shí)現(xiàn)方式

 更新時(shí)間:2022年02月15日 11:59:32   作者:hhxx99  
這篇文章主要介紹了Java調(diào)用C++程序的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java調(diào)用C++程序

這篇博文是自己在學(xué)習(xí)過(guò)程中,踩了很多坑之后,為了避免廣大熱愛(ài)編程的盆友再像我這樣浪費(fèi)太多時(shí)間,索性將自己的實(shí)現(xiàn)方法總結(jié)出來(lái),以供大家參考。程序最終實(shí)現(xiàn)的是Hello World效果,話(huà)不多說(shuō),直接進(jìn)入正題:

1、編寫(xiě)Java程序:HelloWorld

代碼如下:

package HelloWorld;
public class HelloWorld {
   public native void sayHello();   
   public static void main(String[] args) {
   	System.loadLibrary("Win32Project1");
   	HelloWorld tNative = new HelloWorld();
   	tNative.sayHello();
   }
}

2、Windows環(huán)境下,在cmd中編譯以上程序

編譯通過(guò)后,使用 javah -jni HelloWorld.HelloWorld命令,在src文件夾下生成HelloWorld_HelloWorld.h文件(注意,此處我寫(xiě)的兩個(gè)HelloWorld,前一個(gè)指包名,后一個(gè)指類(lèi)名,由于我是寫(xiě)在eclipse中的,所以需要寫(xiě)明包名和類(lèi)名,這樣在cmd中編譯、運(yùn)行時(shí)才不會(huì)報(bào)錯(cuò))。

在執(zhí)行完這一步后,能夠看到HelloWorld.java、HelloWorld.class、HelloWorld_HelloWorld.h這三個(gè)文件是位于同一個(gè)src文件夾下的,如下圖所示(注意,此處的src文件夾是在eclipse中創(chuàng)建HelloWorld這個(gè)java project時(shí)自動(dòng)生成的,并非手動(dòng)創(chuàng)建的):

3、編寫(xiě)C++程序

打開(kāi)Visual Studio 2013,執(zhí)行“文件—>新建—>項(xiàng)目—>Visual C++—>Win32 項(xiàng)目—>確定—>下一步–>選擇DLL(D)–>完成”。

注意,設(shè)置好項(xiàng)目名稱(chēng)以及項(xiàng)目文件所在的位置,如下圖標(biāo)紅處所示:

創(chuàng)建好項(xiàng)目之后,將之前生成的HelloWorld_HelloWorld.h頭文件添加到項(xiàng)目的“頭文件”中,并在源文件中添加helloworld.cpp這一文件,如下圖所示:

接下來(lái),在helloworld.cpp文件中輸入以下代碼:

// helloworld.cpp : 定義DLL應(yīng)用程序的導(dǎo)出函數(shù)。
//
#include "stdafx.h"
#include "HelloWorld_HelloWorld.h"
#include<iostream>
using namespace std;
JNIEXPORT void JNICALL Java_HelloWorld_HelloWorld_sayHello(JNIEnv *, jobject)
{
	cout << "hello world" << endl;
}

右鍵該項(xiàng)目的項(xiàng)目名,選擇“生成”。注意,此時(shí)會(huì)報(bào)錯(cuò)‘error C1083: 無(wú)法打開(kāi)包括文件: “jni.h”: No such file or directory’,解決的辦法是:將你電腦上Java文件夾下,jdk目錄的include目錄下的jni.h文件(比如,D:\Java\jdk1.8.0_144\include)以及win32目錄下的jni_md.h文件(比如,D:\Java\jdk1.8.0_144\include\win32)都拷貝到Visual Studio\vc\include目錄下即可解決該問(wèn)題。然后再次右鍵項(xiàng)目名稱(chēng),選擇“生成”。

4、完成以上步驟后

打開(kāi)你Visual Studio的C++項(xiàng)目源文件所在的文件夾(也就是在創(chuàng)建C++項(xiàng)目時(shí)你所選擇的“位置”的目錄),將Debug目錄下的dll文件拷貝到Java文件夾下,jdk目錄的bin目錄中,如下圖所示:

5、重新編譯HelloWorld.java程序

運(yùn)行,即可得到Hello World這個(gè)結(jié)果。

Java與C++的互調(diào)

C++調(diào)用Java

1)Unix環(huán)境下安裝jdk,并且設(shè)置jdk和jre的環(huán)境變量,如下:

JRE_HOME=/usr/java/jdk1.6.0_04/jre
CLASS_PATH=.:/usr/java/jdk1.6.0_04/lib/dt.jar:/usr/java/jdk1.6.0_04/lib/tools.jar
JAVA_HOME=/usr/java/jdk1.6.0_04
LD_LIBRARY_PATH=/usr/java/jdk1.6.0_04/jre/lib/amd64:/usr/java/jdk1.6.0_04/jre/lib/amd64/server
PATH=/usr/java/jdk1.6.0_04/bin

2)編寫(xiě)java測(cè)試程序,代碼如下:

編譯,生成MyTest.jar,將jar放到unix環(huán)境測(cè)試目錄下。

3)編寫(xiě)c++測(cè)試代碼

  

其中JNI_CreateJavaVM表示創(chuàng)建java虛擬機(jī)環(huán)境,

  • FindClass獲取需要調(diào)用的類(lèi),
  • GetMethodID獲取類(lèi)中的方法;
  • CallStaticIntMethod獲取返回整型靜態(tài)方法;
  • CallBooleanMethod獲取返回布爾類(lèi)型方法
  • DestroyJavaVM釋放虛擬機(jī)。
  • stoJstringjstringTostring函數(shù),是將jvm中類(lèi)型與c++類(lèi)型轉(zhuǎn)換。

調(diào)用類(lèi)中的方法GetMethodID調(diào)用時(shí),第三個(gè)參數(shù)“(II)I”表示方法的輸入輸出參數(shù)類(lèi)型,

“()”里面的標(biāo)識(shí)輸入?yún)?shù)類(lèi)型,括號(hào)外面的表示輸出參數(shù)類(lèi)型。參數(shù)類(lèi)型查看,可以根據(jù)編譯的.class文件,使用命令javap -s -p 類(lèi)名查看,如下圖:

注意:一個(gè)進(jìn)程中只能啟動(dòng)一個(gè)java虛擬機(jī)。

4)編譯與運(yùn)行

編譯時(shí)設(shè)置相關(guān)的頭文件和庫(kù)文件路徑,編譯命令:g++ testjava.cpp -o testjava -I${JAVA_HOME}/include-I${JAVA_HOME}/include/linux -L${JRE_HOME}/lib/amd64/server –ljvm

運(yùn)行結(jié)果如下:

Java調(diào)用C++

1)編寫(xiě)java代碼,如下:

使用native標(biāo)識(shí)方法由c++實(shí)現(xiàn);

System.loadLibrary表示加載c++庫(kù),示例中加載的庫(kù)文件為libMyTest.so

2)將java文件編譯成.class文件,使用javah命令,根據(jù)class文件生成c++的接口頭文件

此時(shí)生成MyTest.h文件,內(nèi)容如下:

3)編寫(xiě)接口函數(shù)的實(shí)現(xiàn),如下:

4)編譯c++文件,生成庫(kù)文件

這時(shí)生成了libMyTest.so庫(kù)文件。

配置庫(kù)文件到環(huán)境變量中

exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/export/home/process/PM/testjava

5)將java程序的jar文件放到同一個(gè)目錄下,運(yùn)行jar,運(yùn)行結(jié)果如下,此時(shí)調(diào)用的sub函數(shù),是C++程序?qū)崿F(xiàn)的。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java導(dǎo)出數(shù)據(jù)庫(kù)的全部表到excel

    java導(dǎo)出數(shù)據(jù)庫(kù)的全部表到excel

    這篇文章主要為大家詳細(xì)介紹了java導(dǎo)出數(shù)據(jù)庫(kù)的全部表到excel的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Spring中Bean創(chuàng)建完后打印語(yǔ)句的兩種方法

    Spring中Bean創(chuàng)建完后打印語(yǔ)句的兩種方法

    這篇文章主要介紹了Spring中Bean創(chuàng)建完后打印語(yǔ)句的兩種方法,一個(gè)是實(shí)現(xiàn)InitializingBean接口,另一個(gè)使用@Bean注解和initMethod屬性,通過(guò)代碼示例介紹的非常詳細(xì),感興趣的小伙伴可以參考閱讀
    2023-07-07
  • springboot全局日期格式化的兩種方式

    springboot全局日期格式化的兩種方式

    這篇文章主要介紹了springboot全局日期格式化的兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Spring的@CrossOrigin注解使用與CrossFilter對(duì)象自定義詳解

    Spring的@CrossOrigin注解使用與CrossFilter對(duì)象自定義詳解

    這篇文章主要介紹了Spring的@CrossOrigin注解使用與CrossFilter對(duì)象自定義詳解,跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制,所謂同源是指,域名,協(xié)議,端口均相同,需要的朋友可以參考下
    2023-12-12
  • IDEA修改idea64.exe.vmoptions文件以及解決coding卡頓問(wèn)題

    IDEA修改idea64.exe.vmoptions文件以及解決coding卡頓問(wèn)題

    IDEA修改idea64.exe.vmoptions文件以及解決coding卡頓問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java中的HashMap集合源碼詳細(xì)解讀

    Java中的HashMap集合源碼詳細(xì)解讀

    這篇文章主要介紹了Java中的HashMap集合源碼詳細(xì)解讀,hash表是一種數(shù)據(jù)結(jié)構(gòu),它擁有驚人的效率,它的時(shí)間復(fù)雜度低到接近O(1)這樣的常數(shù)級(jí),需要的朋友可以參考下
    2023-11-11
  • java自帶的四種線(xiàn)程池實(shí)例詳解

    java自帶的四種線(xiàn)程池實(shí)例詳解

    java線(xiàn)程的創(chuàng)建非常昂貴,需要JVM和OS(操作系統(tǒng))互相配合完成大量的工作,下面這篇文章主要給大家介紹了關(guān)于java自帶的四種線(xiàn)程池的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Eclipse手動(dòng)導(dǎo)入DTD文件實(shí)現(xiàn)方法解析

    Eclipse手動(dòng)導(dǎo)入DTD文件實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Eclipse手動(dòng)導(dǎo)入DTD文件實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • java連接池Druid獲取連接getConnection示例詳解

    java連接池Druid獲取連接getConnection示例詳解

    這篇文章主要為大家介紹了java連接池Druid獲取連接getConnection示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • MyBatisPlus條件構(gòu)造器圖文實(shí)例詳解

    MyBatisPlus條件構(gòu)造器圖文實(shí)例詳解

    這篇文章主要介紹了MyBatisPlus條件構(gòu)造器,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會(huì)的
    2023-01-01

最新評(píng)論

科技| 响水县| 灵川县| 鄂尔多斯市| 渭源县| 衡阳县| 大田县| 临洮县| 修武县| 南开区| 耒阳市| 新乐市| 隆尧县| 墨竹工卡县| 长汀县| 上饶县| 东至县| 颍上县| 江达县| 张掖市| 马公市| 沂南县| 克山县| 儋州市| 阿拉善盟| 山西省| 柯坪县| 长沙县| 鄂温| 罗甸县| 讷河市| 内乡县| 探索| 蒙自县| 宽甸| 博客| 武穴市| 惠东县| 盈江县| 株洲市| 莆田市|