轉載請註明出處:http://www.cnblogs.com/fpzeng/p/4281801.html javascript
源碼請見 https://github.com/fpzeng/HelloJNIhtml
PC系統: ubuntu 12.04java
Android SDK: android-sdk-linux_r24linux
Android NDK:android-ndk-r10dandroid
在android上使用ndk的步驟:git
在com.fpzeng.example.jni.HellojniActivity聲明native方法:github
private native String nativeGetMacAddress(int Parameter1);
此時目錄結構以下: shell
AndroidManifest.xml -jni Android.mk -src hello_jni.c -src -com -fpzeng -example -jni HellojniActivity.java -res ...
使用javah產生jni頭文件,會將產生的頭文件com_fpzeng_example_jni_HellojniActivity.h輸出到jni目錄下。命令以下:ubuntu
javah -jni -d jni -classpath src/ com.fpzeng.example.jni.HellojniActivityapp
產生的 com_fpzeng_example_jni_HellojniActivity.h頭文件以下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_fpzeng_example_jni_HellojniActivity */ #ifndef _Included_com_fpzeng_example_jni_HellojniActivity #define _Included_com_fpzeng_example_jni_HellojniActivity #ifdef __cplusplus extern "C" { #endif /* * Class: com_fpzeng_example_jni_HellojniActivity * Method: nativeGetMacAddress * Signature: (I)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_fpzeng_example_jni_HellojniActivity_nativeGetMacAddress (JNIEnv *, jobject, jint); #ifdef __cplusplus } #endif #endif
此時的入參數是int,返回值類型時String類型。
若是將java中聲明的native方法變的複雜,好比引入Context。在com.fpzeng.example.jni.HellojniActivity聲明native方法更新爲
private native String nativeGetMacAddress(Context context);
運行產生命令: javah -jni -d jni -classpath src/ com.fpzeng.example.jni.HellojniActivity,此時提示錯誤:
Error: Cannot determine signature for Context
這是因爲javah不認識Context類,須要將android.jar包含進來才行。
個人LINUX環境變量中,使用ANDROID_SDK_ROOT指向了當前android-sdk-linux_r24的絕對路徑,你們也須要設置本身的ANDROID SDK環境變量。此時,頭文件的生成命令以下:
javah -jni -d jni -classpath src/:$ANDROID_SDK_ROOT/platforms/android-15/android.jar com.fpzeng.example.jni.HellojniActivity
產生的 com_fpzeng_example_jni_HellojniActivity.h頭文件以下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_fpzeng_example_jni_HellojniActivity */ #ifndef _Included_com_fpzeng_example_jni_HellojniActivity #define _Included_com_fpzeng_example_jni_HellojniActivity #ifdef __cplusplus extern "C" { #endif /* * Class: com_fpzeng_example_jni_HellojniActivity * Method: nativeGetMacAddress * Signature: (Landroid/content/Context;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_fpzeng_example_jni_HellojniActivity_nativeGetMacAddress (JNIEnv *, jobject, jobject); #ifdef __cplusplus } #endif #endif
每次新加native方法都須要運行該命令,是否是很頭痛?
首先在jni/Application.mk中指定當前的工程路徑,用變量APP_PROJECT_PATH指向。
APP_PROJECT_PATH := $(shell pwd) APP_CFLAGS+=-Wno-error=format-security APP_PLATFORM := android-15 APP_ABI := armeabi-v7a APP_OPTIM := debug
而後在jni/Android.mk 加入響應的參數依賴,以下:
headers: $(warning app project path $(APP_PROJECT_PATH)) @cd $(APP_PROJECT_PATH) javah -jni -d jni -classpath src/:$ANDROID_SDK_ROOT/platforms/android-15/android.jar com.fpzeng.example.jni.HellojniActivity
此時運行ndk-build headers,首先打印 aap project path目錄,而後進入該目錄執行javah命令。