JNI 是什麼
1. jni----Java Native Interface的縮寫,中文便是java本地接口。
複製代碼
JNI做用是什麼
1.使得Java 與 本地其餘類型語言(如C、C++)交互
2.在 Java代碼 裏調用 C、C++等語言的代碼 或 C、C++代碼調用 Java 代碼
複製代碼
爲何要有JNI
背景:實際使用中,Java 須要與 本地代碼 進行交互
問題:由於 Java 具有跨平臺的特色,因此Java 與 本地代碼交互的能力很是弱
解決方案: 採用 JNI特性 加強 Java 與 本地代碼交互的能力
複製代碼
實現步驟
1.在Java中聲明Native方法(即須要調用的本地方法)
2.編譯上述 Java源文件javac(獲得 .class文件)
3.經過 javah 命令導出JNI的頭文件(.h文件)
4.使用 Java須要交互的本地代碼 實如今 Java中聲明的Native方法
4.1.如 Java 須要與 C++ 交互,那麼就用C++實現 Java的Native方法
5.編譯.so庫文件
6. 經過Java命令執行 Java程序,最終實現Java調用本地代碼
複製代碼
AS實現步驟
第一步 編寫代碼
在AS的項目中,src/main/java 新建一個類 JniTest(名稱按需求填寫)
裏面內容是(原生C++的方法)好比下:
public native String java2C();
複製代碼
第二步 進行編譯
cmd 進入到 src/main/java 目錄下 執行如下命令
javah -d ../jni 包名(如com.jni.test.JniTest) 回車
會生成一個jni文件夾下的.h文件(com_jni_test_JniTest.h)
複製代碼
第三步 編寫c/c++的源文件(方法名稱必須相同)能夠直接找寫C++的同事開發。
c++文件
//引入剛纔生成的頭文件
#include "com_jni_test_JniTest.h"
//複製頭文件裏的要實現的方法名及其參數
JNIEXPORT jstring JNICALL
Java_com_jni_test_JniTest_java2C(JNIEnv *env, jobject instance) {
// 實現這個方法,返回一個字符串
return env->NewStringUTF("Hello from C++");
}
複製代碼
第四步 從新進行rebuild project
在build/intermediates/ndk/debug/Android.mk 文件 copy出來放在jni目錄下
複製代碼
第五步 在moudle.gradle文件下配置
defaultConfig{
ndk {
moduleName "test"
//so文件名,若是這裏配置了so文件名字,
//記得更改Android.mk裏的LOCAL_MODULE :字段爲 LOCAL_MODULE := test 否則默認名字爲app 不同的話不生效
// abiFilters "armeabi" //指定so文件所支持的CPU類型,若是不寫的話,會生成全部的CPU類型的so文件
}
}
android{
externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk"//指定Android.mk路徑
}
}
}
複製代碼
第六步 再次rebuild。
在build/intermediates/ndkBuild/debug/obj/local 生成各個平臺的so庫。
複製代碼
第七步 生成的庫文件是以 lib名字.so 命名的。
在最開始的java文件夾下的JavaTest類中 添加以下代碼:
static{
System.loadLibrary(「名字」);//注意 這裏的名字 不須要添加lib 直接寫你生成的so庫名字,也不須要後綴名。
}
複製代碼
第八步 調用
在Activity中的調用裏面的方法 這樣就能實現java 與 c++的調用了。
複製代碼
配置長久命令到AS的方式
1,打開項目AS 打開設置界面
2.找到Tools/External Tools
3.點擊右上角的添加 彈出一個Create Tool的對話框
4.Name javah
desc:javah
Program:$JDKPath$\bin\javah.exe
Arguments: -d jni -classpath $ModuleFileDir$\src\main\Java $FileClass$
Working directory: $ModuleFileDir$\src\main
點擊ok 點擊apply 點擊OK
5.在jni代碼類點擊右鍵 找到External Tools 裏面有一個你配置的javah 點擊
直接生成.h文件。
生層.h文件後面操做詳見上面生成代碼 後面步驟同上。
複製代碼
NDK是什麼
Native Development Kit,是 Android的一個工具開發包
JNI 與 NDK 無直接關係 ---- NDK屬於Android,JNI 屬於java
複製代碼
做用
快速開發C、 C++的動態庫,並自動將so和應用一塊兒打包成 APK
經過 NDK在 Android中 使用 JNI與本地代碼(如C、C++)交互
複製代碼
使用步驟(必須下載ndk包--能夠網上下載也能夠在AS下載)
配置 Android NDK環境
建立 Android 項目,並與 NDK進行關聯
在 Android 項目中聲明所須要調用的 Native方法
使用 Android須要交互的本地代碼 實如今Android中聲明的Native方法
好比 Android 須要與 C++ 交互,那麼就用C++ 實現 Java的Native方法
經過 ndk - bulid 命令編譯產生.so庫文件
編譯 Android Studio 工程,從而實現 Android 調用本地代碼
本人用的AS下載的版本AS版本3.4
複製代碼