<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
這篇博文是自己在學習過程中,踩了很多坑之後,為了避免廣大熱愛程式設計的盆友再像我這樣浪費太多時間,索性將自己的實現方法總結出來,以供大家參考。程式最終實現的是Hello World效果,話不多說,直接進入正題:
程式碼如下:
package HelloWorld; public class HelloWorld { public native void sayHello(); public static void main(String[] args) { System.loadLibrary("Win32Project1"); HelloWorld tNative = new HelloWorld(); tNative.sayHello(); } }
編譯通過後,使用 javah -jni HelloWorld.HelloWorld命令,在src資料夾下生成HelloWorld_HelloWorld.h檔案(注意,此處我寫的兩個HelloWorld,前一個指包名,後一個指類名,由於我是寫在eclipse中的,所以需要寫明包名和類名,這樣在cmd中編譯、執行時才不會報錯)。
在執行完這一步後,能夠看到HelloWorld.java、HelloWorld.class、HelloWorld_HelloWorld.h這三個檔案是位於同一個src資料夾下的,如下圖所示(注意,此處的src資料夾是在eclipse中建立HelloWorld這個java project時自動生成的,並非手動建立的):
開啟Visual Studio 2013,執行“檔案—>新建—>專案—>Visual C++—>Win32 專案—>確定—>下一步–>選擇DLL(D)–>完成”。
注意,設定好專案名稱以及專案檔案所在的位置,如下圖示紅處所示:
建立好專案之後,將之前生成的HelloWorld_HelloWorld.h標頭檔案新增到專案的“標頭檔案”中,並在原始檔中新增helloworld.cpp這一檔案,如下圖所示:
接下來,在helloworld.cpp檔案中輸入以下程式碼:
// helloworld.cpp : 定義DLL應用程式的匯出函數。 // #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; }
右鍵該專案的專案名,選擇“生成”。注意,此時會報錯‘error C1083: 無法開啟包括檔案: “jni.h”: No such file or directory’,解決的辦法是:將你電腦上Java資料夾下,jdk目錄的include目錄下的jni.h檔案(比如,D:Javajdk1.8.0_144include)以及win32目錄下的jni_md.h檔案(比如,D:Javajdk1.8.0_144includewin32)都拷貝到Visual Studiovcinclude目錄下即可解決該問題。然後再次右鍵專案名稱,選擇“生成”。
開啟你Visual Studio的C++專案原始檔所在的資料夾(也就是在建立C++專案時你所選擇的“位置”的目錄),將Debug目錄下的dll檔案拷貝到Java資料夾下,jdk目錄的bin目錄中,如下圖所示:
執行,即可得到Hello World這個結果。
1)Unix環境下安裝jdk,並且設定jdk和jre的環境變數,如下:
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)編寫java測試程式,程式碼如下:
編譯,生成MyTest.jar,將jar放到unix環境測試目錄下。
3)編寫c++測試程式碼
其中JNI_CreateJavaVM表示建立java虛擬機器器環境,
FindClass
獲取需要呼叫的類,GetMethodID
獲取類中的方法;CallStaticIntMethod
獲取返回整型靜態方法;CallBooleanMethod
獲取返回布林型別方法DestroyJavaVM
釋放虛擬機器器。stoJstring
和jstringTostring
函數,是將jvm中型別與c++型別轉換。呼叫類中的方法GetMethodID呼叫時,第三個引數“(II)I”表示方法的輸入輸出引數型別,
“()”裡面的標識輸入引數型別,括號外面的表示輸出引數型別。引數型別檢視,可以根據編譯的.class檔案,使用命令javap -s -p 類名檢視,如下圖:
注意:一個程序中只能啟動一個java虛擬機器器。
4)編譯與執行
編譯時設定相關的標頭檔案和庫檔案路徑,編譯命令:g++ testjava.cpp -o testjava -I${JAVA_HOME}/include-I${JAVA_HOME}/include/linux -L${JRE_HOME}/lib/amd64/server –ljvm
執行結果如下:
1)編寫java程式碼,如下:
使用native標識方法由c++實現;
System.loadLibrary表示載入c++庫,範例中載入的庫檔案為libMyTest.so
2)將java檔案編譯成.class檔案,使用javah命令,根據class檔案生成c++的介面標頭檔案
此時生成MyTest.h檔案,內容如下:
3)編寫介面函數的實現,如下:
4)編譯c++檔案,生成庫檔案
這時生成了libMyTest.so庫檔案。
設定庫檔案到環境變數中
exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/export/home/process/PM/testjava
5)將java程式的jar檔案放到同一個目錄下,執行jar,執行結果如下,此時呼叫的sub函數,是C++程式實現的。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45