很久沒有搞JNI了,據說AndroidStudio能夠調試C++了,今天把JNI開發再熟悉下。java
在AndroidStudio中能夠直接下載JNI開發的相關NDK和工具,不須要單獨下載NDK了。android
這樣,編譯JNI有兩種方式,ndk-build和CMakeapp
1、ndk-build方式工具
1. 新建Projectgradle
2. 建立Java類,添加本地方法ui
public class HelloJni { static { System.loadLibrary("hello-jni"); } public static native String getJniString(); }
3. 選擇[build]->[Make Project]生成classthis
4. 使用javah命令生成.h文件spa
// 命令行進入 cd app/src/main // 在src/main下生成jin文件夾和.h文件 javah -d jni -classpath ./java com.outman.myjni.HelloJni
5. 生成的com_outman_myjni_HelloJni.h文件以下.net
默認有2個參數,重點說下第二個參數插件
jclass java代碼方法,是static類型的,則生成的是jclass類型參數
jobject java代碼方法,是非static類型的,則生成的是jobject類型參數
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_outman_myjni_HelloJni */ #ifndef _Included_com_outman_myjni_HelloJni #define _Included_com_outman_myjni_HelloJni #ifdef __cplusplus extern "C" { #endif /* * Class: com_outman_myjni_HelloJni * Method: getJniString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_outman_myjni_HelloJni_getJniString (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
6. 在jni文件夾中建立cpp文件
#include <jni.h> #include <com_outman_myjni_HelloJni.h> JNIEXPORT jstring JNICALL Java_com_outman_myjni_HelloJni_getJniString (JNIEnv *env, jclass obj) { char *result = "this is call from JNI C++"; jstring jstr = env->NewStringUTF(result); return jstr; }
7. 在jni文件夾建立Android.mk文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_C_INCLUDES+= $(LOCAL_PATH) SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) SRC_FILES := $(SRC_FILES:$(LOCAL_PATH)/%=%) LOCAL_SRC_FILES := $(SRC_FILES) #LOCAL_LDLIBS := -llog -landroid LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)
8. [build]->[Make Project]編譯工程
若是未安裝XCode,會彈窗要求安裝,安裝便可
9. 配置gradle支持
有種簡單方法,就是經過AndroidStudio Link C++功能
選中Android.mk -> File -> Link C++ 選擇ndk-build,並選擇工程中的Android.mk文件
10. 完成後,會在build.gradle中生成ndk支持
android { defaultConfig { ndk{ moduleName "hello-jni" abiFilters "armeabi" } } externalNativeBuild { ndkBuild { path 'src/main/jni/Android.mk' } } }
11. gradle.properties中添加支持
android.useDeprecatedNdk=true
12. 完成以上,build工程便可生成.so文件
不過要注意,so沒有生成在lib下,而是在
app->build->intermediates->ndkBuild
但不影響使用
2、CMake方式
1. 下載完成插件後,新建Project時,選中Include C++ Support便可
2. 生成的Project會自動生成Demo,就不詳細介紹了。
3、ndk-build和CMake的一點區別
主要是配置的不一樣,再也不詳細描述,能夠參考另外一篇轉載的文章。
https://my.oschina.net/android520/blog/805249