JNI 是什么
1. jni----Java Native Interface的縮寫(xiě)肌索,中文即是java本地接口。
JNI作用是什么
1.使得Java 與 本地其他類型語(yǔ)言(如C锭部、C++)交互
2.在 Java代碼 里調(diào)用 C趁俊、C++等語(yǔ)言的代碼 或 C柒莉、C++代碼調(diào)用 Java 代碼
為什么要有JNI
背景:實(shí)際使用中,Java 需要與 本地代碼 進(jìn)行交互
問(wèn)題:因?yàn)?Java 具備跨平臺(tái)的特點(diǎn),所以Java 與 本地代碼交互的能力非常弱
解決方案: 采用 JNI特性 增強(qiáng) Java 與 本地代碼交互的能力
實(shí)現(xiàn)步驟
1.在Java中聲明Native方法(即需要調(diào)用的本地方法)
2.編譯上述 Java源文件javac(得到 .class文件)
3.通過(guò) javah 命令導(dǎo)出JNI的頭文件(.h文件)
4.使用 Java需要交互的本地代碼 實(shí)現(xiàn)在 Java中聲明的Native方法
4.1.如 Java 需要與 C++ 交互德频,那么就用C++實(shí)現(xiàn) Java的Native方法
5.編譯.so庫(kù)文件
6. 通過(guò)Java命令執(zhí)行 Java程序,最終實(shí)現(xiàn)Java調(diào)用本地代碼
AS實(shí)現(xiàn)步驟
第一步 編寫(xiě)代碼
在AS的項(xiàng)目中缩幸,src/main/java 新建一個(gè)類 JniTest(名稱按需求填寫(xiě))
里面內(nèi)容是(原生C++的方法)比如下:
public native String java2C();
第二步 進(jìn)行編譯
cmd 進(jìn)入到 src/main/java 目錄下 執(zhí)行以下命令
javah -d ../jni 包名(如com.jni.test.JniTest) 回車
會(huì)生成一個(gè)jni文件夾下的.h文件(com_jni_test_JniTest.h)
第三步 編寫(xiě)c/c++的源文件(方法名稱必須相同)可以直接找寫(xiě)C++的同事開(kāi)發(fā)壹置。
c++文件
//引入剛才生成的頭文件
#include "com_jni_test_JniTest.h"
//復(fù)制頭文件里的要實(shí)現(xiàn)的方法名及其參數(shù)
JNIEXPORT jstring JNICALL
Java_com_jni_test_JniTest_java2C(JNIEnv *env, jobject instance) {
// 實(shí)現(xiàn)這個(gè)方法竞思,返回一個(gè)字符串
return env->NewStringUTF("Hello from C++");
}
第四步 重新進(jìn)行rebuild project
在build/intermediates/ndk/debug/Android.mk 文件 copy出來(lái)放在jni目錄下
第五步 在moudle.gradle文件下配置
defaultConfig{
ndk {
moduleName "test"
//so文件名,如果這里配置了so文件名字钞护,
//記得更改Android.mk里的LOCAL_MODULE :字段為 LOCAL_MODULE := test 不然默認(rèn)名字為app 不一樣的話不生效
// abiFilters "armeabi" //指定so文件所支持的CPU類型盖喷,如果不寫(xiě)的話,會(huì)生成所有的CPU類型的so文件
}
}
android{
externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk"http://指定Android.mk路徑
}
}
}
第六步 再次rebuild难咕。
在build/intermediates/ndkBuild/debug/obj/local 生成各個(gè)平臺(tái)的so庫(kù)课梳。
第七步 生成的庫(kù)文件是以 lib名字.so 命名的。
在最開(kāi)始的java文件夾下的JavaTest類中 添加如下代碼:
static{
System.loadLibrary(“名字”);//注意 這里的名字 不需要添加lib 直接寫(xiě)你生成的so庫(kù)名字余佃,也不需要后綴名暮刃。
}
第八步 調(diào)用
在Activity中的調(diào)用里面的方法 這樣就能實(shí)現(xiàn)java 與 c++的調(diào)用了。
配置長(zhǎng)久命令到AS的方式
1爆土,打開(kāi)項(xiàng)目AS 打開(kāi)設(shè)置界面
2.找到Tools/External Tools
3.點(diǎn)擊右上角的添加 彈出一個(gè)Create Tool的對(duì)話框
4.Name javah
desc:javah
Program:$JDKPath$\bin\javah.exe
Arguments: -d jni -classpath $ModuleFileDir$\src\main\Java $FileClass$
Working directory: $ModuleFileDir$\src\main
點(diǎn)擊ok 點(diǎn)擊apply 點(diǎn)擊OK
5.在jni代碼類點(diǎn)擊右鍵 找到External Tools 里面有一個(gè)你配置的javah 點(diǎn)擊
直接生成.h文件椭懊。
生層.h文件后面操作詳見(jiàn)上面生成代碼 后面步驟同上。
NDK是什么
Native Development Kit雾消,是 Android的一個(gè)工具開(kāi)發(fā)包
JNI 與 NDK 無(wú)直接關(guān)系 ---- NDK屬于Android,JNI 屬于java
作用
快速開(kāi)發(fā)C灾搏、 C++的動(dòng)態(tài)庫(kù),并自動(dòng)將so和應(yīng)用一起打包成 APK
通過(guò) NDK在 Android中 使用 JNI與本地代碼(如C立润、C++)交互
使用步驟(必須下載ndk包--可以網(wǎng)上下載也可以在AS下載)
配置 Android NDK環(huán)境
創(chuàng)建 Android 項(xiàng)目狂窑,并與 NDK進(jìn)行關(guān)聯(lián)
在 Android 項(xiàng)目中聲明所需要調(diào)用的 Native方法
使用 Android需要交互的本地代碼 實(shí)現(xiàn)在Android中聲明的Native方法
比如 Android 需要與 C++ 交互,那么就用C++ 實(shí)現(xiàn) Java的Native方法
通過(guò) ndk - bulid 命令編譯產(chǎn)生.so庫(kù)文件
編譯 Android Studio 工程桑腮,從而實(shí)現(xiàn) Android 調(diào)用本地代碼
本人用的AS下載的版本AS版本3.4