1.下載android ndk 推薦版本爲:android-ndk64-r10b-windows-x86_64
2.配置NDK,點Window->Preferences->Android->NDK,設置NDK路徑。
3.爲eclipse 配置生成jni調用頭文件的命令工具,具體設置如下:
Name:javah
Location:%JAVA_HOME%/bin/avah.exe
Work Directory:${project_loc}
Arguments:-v -classpath "${project_loc}/bin/classes" -d "${project_loc}/jni" ${java_type_name}
4.創建一個普通的android工程NDKTest,在工程上右鍵點擊Android Tools->Add Native Suppor,然後給.so文件取個名字(默認已經起好了,就是包名NDKTest)。這時候工程就會多一個jni的文件夾,jni下有Android.mk和NDKTest.cpp文件。Android.mk是NDK工程的Makefile,NDKTest.cpp就是NDK的源文件。
5.在android中添加一個jni調用的類,名爲JNI。在其中添加native的調用方法,代碼如下:
package com.example.ndktest;
public class JNI {
public native String NDKTestFromJNI();// native聲明,表示這個方法來自Native層。實現過程已經在native層實現了
static {
System.loadLibrary("NDKTest");// 加載庫,前面的lib和後綴名不用寫
}
}
6.點擊這個JNI類,再點擊菜單工具的javah,就在工程的jni目錄下生成了jni調用的頭文件,com_example_ndktest_JNI.h代碼如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_ndktest_JNI */
#ifndef _Included_com_example_ndktest_JNI
#define _Included_com_example_ndktest_JNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_ndktest_JNI
* Method: NDKTestFromJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_ndktest_JNI_NDKTestFromJNI
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
7.在NDKTest.cpp中引用這個頭文件,並實現其中的jni調用方法,代碼如下:
#include <jni.h>
#include <string.h>
#include "com_example_ndktest_JNI.h"
JNIEXPORT jstring JNICALL Java_com_example_ndktest_JNI_NDKTestFromJNI(JNIEnv* env,
jobject thiz) {
return env->NewStringUTF("Hello from JNI !");
}
8.在android中調用JNI中的方法:
TextView tv = new TextView(this);
JNI jni=new JNI();
tv.setText(jni.NDKTestFromJNI());
setContentView(tv);
9.增加其他芯片的so的生成。默認情況下so只生成armeabi目錄下的so,要爲其他的芯片架構生成so,需要在工程的jni目錄下添加Application.mk文件,內容如下:
APP_ABI := armeabi armeabi-v7a arm64-v8a x86
就可以生成armeabi、 armeabi-v7a、 arm64-v8a 、x86四個目錄下的so包,其他的芯片架構,以此類推。