配置開發環境:
1:下載ndk,導入android studio中。

2:在項目中引入NDK

3:在計算機path變量中導入NDK路徑,在編譯.h文件的時候會用到。

一:建立java的native方法,然后編譯生成.class文件.

二:根據.class文件生成.h文件。
1:打開Terminal,然后進入APP目錄下的main主目錄。
2:輸入命令。

3:生成.h文件,生成的jni文件夾在main文件夾下。

三:根據.h文件編寫.c文件。
#include <string.h>
#include <jni.h>
jstring Java_com_xingdongmei_media_FirstJni_getFromName(JNIEnv *env, jobject ob){
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
void Java_com_xingdongmei_media_FirstJni_setAge(JNIEnv *env, jobject ob, jfloat age){
// printf("asdf!");
}
調用getFromName方法,返回"hello from JNI !"
四:在jni文件夾下新建application.mk文件和Android.mk文件,如下
Application.mk文件
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := x86 armeabi armeabi-v7a
APP_PLATFORM := android-8
Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := firstJni
LOCAL_SRC_FILES := FirstJni.c
include $(BUILD_SHARED_LIBRARY)
五:進入jni文件夾,在terminal命令窗口輸入ndk-build,然后就能在main文件夾下生成libs文件夾和obj文件夾。

六:在build.gradle中配置.so文件的路徑。我的為:
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
}
七:運行結果:

八:常見錯誤
1:如果只有c/cpp文件,直接這樣編譯的話,會報錯,這應該是android studio 在這種情況自動生成Android.mk 時的一個bug,見編譯錯誤。
Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'G:\android-ndk\android-ndk-r10\ndk-build.cmd'' finished with non-zero exit value 2
解決方法:
在jni文件下建一個空的empty.c文件 編譯運行即可。
2:找不到.so文件。
10-08 03:03:12.100 11948-11948/? E/dalvikvm﹕ dlopen("native/libfirstJni.so") failed: dlopen failed: library "native/libfirstJni.so" not found
10-08 03:03:12.110 11948-11948/? E/CrashHandlerUtils﹕ java.lang.UnsatisfiedLinkError: dlopen failed: library "native/libfirstJni.so" not found
解決方法:
在項目的APP目錄下的build.gradle里面加上.so上級目錄文件的路徑。
我的.so文件上級目錄結構如圖:

我的build.gradle配置的.so文件路徑:
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
}
