Java Native Interface (JNI)標準是java平臺的一部分,它容許Java代碼和其餘語言寫的代碼進行交互。JNI 是本地編程接口,它使得在 Java 虛擬機 (VM) 內部運行的 Java 代碼可以與用其它編程語言(如 C、C++ 和彙編語言)編寫的應用程序和庫進行交互操做。
因爲Android的應用層的類都是以Java寫的,這些Java類編譯爲Dex型式的Bytecode以後,必須靠Dalvik虛擬機(VM: Virtual Machine)來執行。VM在Android平臺裏,扮演很重要的角色。
(多的咱不說了,介紹什麼的 處處都有能夠去搜一下)
我們先建一個NdkJniDemo的工程java
新建JniUtils類實現native方法android
public class JniUtils { public static native String getStringFormC(); }
而後clean project 再rebuild project 生成class文件,
這時候打開以下圖的文件夾看是否生成了classes文件夾,沒有生成請從新來過。
再打開Terminal輸入指令
` cd app/build/intermediates/classes/debug
`
而後再輸入指令javah -jni com.wobiancao.ndkjnidemo.ndk.JniUtils
注意 這裏javah -jni後面跟的是JniUtils類的全路徑,若是javah報不存在之類的,是你的java環境沒有配置好。git
這時候打開classes/debug下面的文件發現多了一個文件com_wobiancao_ndkjnidemo_ndk_JniUtils.h
而後在src/main下新建文件夾jni,把生成的.h文件複製或者剪切到jni文件夾下面去,新建一個c類隨便取一個名字,添加代碼以下github
//// Created by XY on 16/1/4.// #include "com_wobiancao_ndkjnidemo_ndk_JniUtils.h" /* * Class: Java_com_wobiancao_ndkjnidemo_ndk_JniUtils * Method: getStringFormC * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_wobiancao_ndkjnidemo_ndk_JniUtils_getStringFormC (JNIEnv *env, jobject obj){ return (*env)->NewStringUTF(env,"這裏是來自c的string");
這裏發現頭文件#include <jni.h>
報紅色,是由於我們尚未配置ndk環境,打開file->project structure
選擇你所下載的ndk環境路徑,若是沒有ndk這裏有個地址你們能夠去下載 一個安卓工具集合的網站:http://androiddevtools.cn/編程
設置好了以後,發現頭文件仍是紅色的,而後再build一下工程,就會有提示app
Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.編程語言
按着提示作就好了 在gradle.properties文件末尾添加android.useDeprecatedNdk=true
就ok啦
而後在app文件下得build.gradle ->defaultConfig括號內添加以下代碼ide
ndk { moduleName "NdkJniDemo" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結構下的so庫,目前無關緊要。}
到了這一步從新build項目,發現已經沒有變紅了。接下來就是運用了,在JniUtils類裏面添加以下代碼工具
static { System.loadLibrary("NdkJniDemo");//以前在build.gradle裏面設置的so名字,必須一致 }
而後簡單調用就好了,MainActivity代碼以下gradle
public class MainActivity extends AppCompatActivity { TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.ndk_text); textView.setText(JniUtils.getStringFormC()); } }
運行結果如圖
我們打開app->intermediates-ndk-debug發現生成了三個文件夾,而且對應了以前咱們在build.gradle配置的abiFilters
大功告成。
新建libs文件夾把這三個文件夾放進去
而後刪除我們的jni文件試試,是否工程還能運用?
ok 教程完畢
最後出一個利用jni的Aes加密demo運行結果如圖所示
項目地址:https://github.com/a12a15a05/NdkJniDemo
謝謝star歡迎點贊=。=轉載註明來源便可