Android studio JNI jni实例
1.Jni的作用
?
1.Jni的作用
Java是一種比較高級的語言,Java調(diào)用c庫,調(diào)用c++庫是必不可少的,所以Jni就應運而生了。看了這個文章的同學,應該能夠自己寫個APK裝在自己的手機里面吧,以前剛開始做android的時候,寫了一個“地瓜手電筒”和一個音樂播放器。
NDK:NDK是Native Development Kit的縮寫,是Google提供的一套工具集,可以讓你其他語言(C、C++或匯編)開發(fā) Android的 JNI。NDK可以編譯多平臺的so,開發(fā)人員只需要簡單修改 mk 文件說明需要的平臺,不需要改動任何代碼,NDK就可以幫你編譯出所需的so庫。
JNI:JNI是Java本機接口(Java Native Interface),是一個本機編程接口,它是Java軟件開發(fā)工具箱(Java Software Development Kit,SDK)的一部分。JNI允許Java代碼使用以其他語言編寫的代碼和代碼庫。Invocation API(JNI的一部分)可以用來將Java虛擬機(JVM)嵌入到本機應用程序中,從而允許程序員從本機代碼內(nèi)部調(diào)用Java代碼。不過,對Java外部的調(diào)用通常不能移植到其他平臺,在applet中還可能引發(fā)安全異常。實現(xiàn)本地代碼將使您的Java應用程序無法通過100%純Java測試。
?
2.生成一個JNI 的libjni.so庫
我這個例子主要是在有android源碼的編譯環(huán)境下測試的,我有Android 7.1的開發(fā)編譯環(huán)境,如果大家做Android 系統(tǒng)開發(fā)或者應用開發(fā),有一個Android的開發(fā)環(huán)境非常有必要,或者需要自己下載Android NDK。
?
2.1.在源碼位置下新建一個源碼路徑
HelloWorld.java源碼如下
package?com.wqf.hellojni;public?class?HelloWorld{public?static?native?String?helloWorld();public?static?native?int?add(int?a,int?b);}?
2.2 用命令編譯生成頭文件
1、用命令
javac com/wqf/hellojni/HelloWorld.java
生成HelloWorld.class
2、用命令
javah -classpath . -jni com.wqf.hellojni.HelloWorld
生成頭文件
注意:
網(wǎng)上很多說明用
javah -jni com.wqf.hellojni.HelloWorld?
生成頭文件,我試過很多次,都是失敗,還是用我上面那個命令,可以看看javah的命令幫助
?
2.3 編譯生成libjni.so庫步驟
2.3.1 在jni目錄里面建立幾個文件如下
1、把上面生成的
com_wqf_hellojni_HelloWorld.h
放到這個目錄來
2、新建一個jni.c文件用來實現(xiàn)上面頭文件里面的方法
3、新建一個Android.mk文件用來編譯
Android.mk的內(nèi)容如下
######################################### LOCAL_PATH?:=?$(call?my-dir) include?$(CLEAR_VARS) LOCAL_SRC_FILES:=?jni.c LOCAL_MODULE?:=?libjni? include?$(BUILD_SHARED_LIBRARY)???
2.3.2 jni.c的內(nèi)容如下
關于JNI的語法大家可以自行百度看看,說明的很多,這里不再詳細說明,下面也比較簡單。
//自己創(chuàng)建一個c文件,實現(xiàn)自己定義的native方法,也就是.h文件中的方法 //引入自己生成的.h頭文件 #include?"com_wqf_hellojni_HelloWorld.h"//返回一個字符串 JNIEXPORT?jstring?JNICALL?Java_com_wqf_hellojni_HelloWorld_helloWorld(JNIEnv?*env,?jclass?jobj)?{return?(*env)->NewStringUTF(env,"HelloWorld?我是用jni調(diào)用出來的字符串"); } //返回?a+b的結(jié)果 JNIEXPORT?jint?JNICALL?Java_com_wqf_hellojni_HelloWorld_add(JNIEnv?*env,?jclass?jobj,?jint?a,?jint?b){return?a+b; }?
2.3.3 編譯
使用mm -B?命令編譯生成so文件編譯結(jié)果如下圖
說個小細節(jié),我們編譯生成的libjni.so,我們要會看他的幾個參數(shù)
1、文件類型,使用file命令查看是32位的庫還是64位的庫
2、使用md5sum命令查看md5碼,這個可以查看文件的唯一md5碼,以后遇到一個文件名字一樣的可以用這個方式知道是不是同一個文件
?
3. 寫個簡單的apk測試一下
我們的APK編寫用的是android studio來編寫的,現(xiàn)在android studio是非常主流的android開發(fā)工具,如果大家想自己做一個小的DEMO的話,建議裝這個工具,網(wǎng)上安裝流程非常多了,下載SDK后,最好不要放在C盤,要不然重裝系統(tǒng)后又沒有了。
3.1先來一個整體的運行效果圖片
注意:HelloWorld.java的包名要跟com_wqf_hellojni_HelloWorld .h上面生產(chǎn)庫頭文件對應起來,要不然運行會出現(xiàn)問題,要特別注意。
我們在圖片上可以看到add = 9,這個是我們在JNI里面的輸出結(jié)果
?
3.2 APK編譯步驟和幾個注意的細節(jié)
我是在Android 7.1上編寫APK進行測試的,相比其他Android版本,Android 7.1的問題更多,我說下操作步驟和細節(jié)。
3.2.1、我們先編寫一個可以運行的APK
我們需要編寫一個helloworld的簡單apk,這個apk不需要引用庫文件,直接輸出一個helloworld。
?
3.2.2、然后我們引用我們的庫文件
這里注意的是HelloWorld.java 里面的內(nèi)容
加載庫的代碼
在MainActivity.java里面導入包并調(diào)用add函數(shù)
?
4. 源碼連接
源碼我放在github上面,方面查看,有源碼的例程大家研究起來更加得心應手
https://github.com/weiqifa0/androidjni
參考:
https://blog.csdn.net/a_zhon/article/details/53097512#
?
? ? ?
歡迎加我微信拉大家進微信技術討論群
?
?
歡迎關注微信公眾號-嵌入式Linux
覺得不錯,請幫忙轉(zhuǎn)發(fā),您的每一次支持,我都將銘記于心
?
?
?
?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Android studio JNI jni实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端上传文件后端到服务器,前端js上传文
- 下一篇: 漫画-Linux中断子系统综述