JNI全稱(chēng)是Java Native Interface,為Java本地接口,是連接Java層與Native層的橋梁。
是連接Java和c的一種語(yǔ)言。
1:cpp文件
路徑:src/main/jni
find_name.cpp
cpp文件就需要jni語(yǔ)言來(lái)編寫(xiě),它的作用是調(diào)用第三方so的.h文件,從而實(shí)現(xiàn)調(diào)用第三方的so庫(kù)。
我這里就先不調(diào)用.h文件了,簡(jiǎn)單返回一下就好了。
#include <jni.h>
#include <string.h>
extern "C"
jstring Java_com_example_aiosceneengine_util_JniUtil_test(JNIEnv* env, jclass thiz) {
return env->NewStringUTF("不支持(請(qǐng)關(guān)注官方群或本軟件中軟件更新鏈接)");
}
Java_com_example_aiosceneengine_util_JniUtil_test是一種固定的寫(xiě)法。
其中Java:Java去調(diào)用
com_example_aiosceneengine:java項(xiàng)目的包名
JniUtil:調(diào)用這個(gè)JNI類(lèi)的類(lèi)名,
test:對(duì)應(yīng)方法的名字了
2. 導(dǎo)入Android.mk文件
這個(gè)路徑也是src/main/jni
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# 指定so庫(kù)文件的名稱(chēng)
LOCAL_MODULE := jni_mix
# 指定需要編譯的源文件列表
LOCAL_SRC_FILES := find_name.cpp
# 指定C++的編譯標(biāo)志
LOCAL_CPPFLAGS += -fexceptions
# 指定要加載的靜態(tài)庫(kù)
#LOCAL_WHOLE_STATIC_LIBRARIES += android_support
# 指定需要鏈接的庫(kù)
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
$(call import-module, android/support)
3.配置build.gradle
android -> defaultConfig 下添加
ndk {
// 設(shè)置支持的SO庫(kù)架構(gòu),第三方給的so庫(kù)哪幾種架構(gòu),就配置這幾種架構(gòu)
abiFilters 'arm64-v8a'
}
android 下添加
externalNativeBuild {
ndkBuild {
path file('src/main/jni/Android.mk')
}
}
packagingOptions{
pickFirst 'lib/arm64-v8a/libjni_mix.so'
}
sourceSets 下添加
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['src/main/jniLibs']
}
4.編譯項(xiàng)目
路徑在: build → intermediates → ndkBuild → debug → obj → local下
5.將生成的so拷入src/main/jniLibs中

圖片.png
6.調(diào)用C代碼
package com.example.aiosceneengine.util;
import android.util.Log;
public class JniUtil {
//native表示是加載的jni方法
public static native String test();
static {
//一定要記得加載so
System.loadLibrary("jni_mix");
}
public static void myTest() {
new Thread(() -> {
String str = test();
Log.v("TAG", "HAHA:" + str);
}).start();
}
}
7.成功調(diào)用

圖片.png
8.調(diào)用第三方so庫(kù)
待更新......