JNI全称是Java Native Interface,为Java本地接口,是连接Java层与Native层的桥梁。
是连接Java和c的一种语言。
1:cpp文件
路径:src/main/jni
find_name.cpp
cpp文件就需要jni语言来编写,它的作用是调用第三方so的.h文件,从而实现调用第三方的so库。
我这里就先不调用.h文件了,简单返回一下就好了。
#include <jni.h>
#include <string.h>
extern "C"
jstring Java_com_example_aiosceneengine_util_JniUtil_test(JNIEnv* env, jclass thiz) {
return env->NewStringUTF("不支持(请关注官方群或本软件中软件更新链接)");
}
Java_com_example_aiosceneengine_util_JniUtil_test是一种固定的写法。
其中Java:Java去调用
com_example_aiosceneengine:java项目的包名
JniUtil:调用这个JNI类的类名,
test:对应方法的名字了
2. 导入Android.mk文件
这个路径也是src/main/jni
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# 指定so库文件的名称
LOCAL_MODULE := jni_mix
# 指定需要编译的源文件列表
LOCAL_SRC_FILES := find_name.cpp
# 指定C++的编译标志
LOCAL_CPPFLAGS += -fexceptions
# 指定要加载的静态库
#LOCAL_WHOLE_STATIC_LIBRARIES += android_support
# 指定需要链接的库
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
$(call import-module, android/support)
3.配置build.gradle
android -> defaultConfig 下添加
ndk {
// 设置支持的SO库架构,第三方给的so库哪几种架构,就配置这几种架构
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.编译项目
路径在: build → intermediates → ndkBuild → debug → obj → local下
5.将生成的so拷入src/main/jniLibs中
6.调用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.成功调用
8.调用第三方so库
待更新......