1.新建MyJni.java
public class MyJni {
static {
System.loadLibrary("MyJni");
}
public native static String getString();
}
2.生成MyJni的.class文件
點擊一下 make project 會在app的build目錄下面生成MyJni.class文件,不同版本的AS,生成的路徑也不同,只要找到對應生成的路徑並記錄
3.生成 xxx.h 文件
在app/src/main文件夾下新建一個jni文件夾,然後打開Android Studio的終端,cd到這個jni目錄,然後輸入下面的指令:
javah -jni -classpath xxx.xxx.xxx.MyJni(第二步中生成的MyJni.class路徑)
就會在這個jni文件夾下生成一個.h文件,包名_MyJni.h,文件內容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class 包名_MyJni */
#ifndef _Included_包名_MyJni
#define _Included_包名_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: 包名_MyJni
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_包名_MyJni_getString
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
4.生成test.c實現上面的.h文件
在jni目錄下新建一個c/c++source file ,取名test.c 實現上面.h文件中的方法
#include "jni.h"
#include "包名_MyJni.h"
JNIEXPORT jstring JNICALL Java_包名_MyJni_getString
(JNIEnv *env, jclass jz){
return (*env)->NewStringUTF(env,"此處填寫需要獲取的字符串");
}
5.生成Android.mk和Application.mk文件
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := MyJni
LOCAL_SRC_FILES := test.c
LOCAL_LDLIBS +=-L$(SYSROOT)/usr/lib -lm -llog
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_STL := c++_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := all
APP_PLATFORM := android-16
6.下載Android Studio中的NDK
1.直接在工具包中下載
2.我的AS下載不了,不知道爲什麼。所以直接去官網下載了NDK地址
3.下載完成後在project structure中配置NDK路徑
4.配置環境變量
7.生成so文件
然後在終端進入到jni目錄,輸入指令 ndk-build,就會生成相應的so文件
8.調用so文件
在app目錄下的build.gradle的android{}閉包中添加如下代碼:
sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = [] //屏蔽掉默認的jni編譯生成過程
}
}
調用方法
String text = MyJni.getString();
獲取到的text就是第四步中填寫的字符串
9.遇到的坑
1.尋找MyJni.class文件,因爲AndroidStudio版本的不同,build的目錄結構不一樣
2.終端切換目錄:cd 路徑
3.生成.mk文件:實在找不到哪個file的類型是.mk結尾,直接在桌面新建一個記事本,改格式爲mk然後複製到項目中
4.ndk-build提示:不是內部或外部命令,是因爲沒有在環境變量配置NDK
5.輸入ndk-build之後提示:Android NDK: WARNING: APP_PLATFORM android-16 is higher than android:minSdkVersion 1 in AndroidManifest.xml。在AndroidManifest.xml文件中加入:
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="29" />
這裏填寫的最小和目標版本應該是和build.gradle中一致(沒去研究)
在Application.mk中APP_PLATFORM := android-16這個版本號 不能比你的最小SDK版本大
APP_PLATFORM := android-16這裏的可填版本號是看NDK路徑下的platforms