新增一个cpp
//
// Created by QLH on 2023/3/27.
//
#include <jni.h>
#include <android/log.h>
#define TAG "QLH"
//__VA_ARGS__ 代表...的可变参数
#define LogD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__);
#define LogE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__);
#define LogI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__);
//内部对应Java函数的具体实现
void func1(JNIEnv *env, jobject jobject1) {
LogE("dynamicNative1,动态注册")
}
jstring func2(JNIEnv *env, jobject jobject1) {
LogE("dynamicNative2,动态注册")
return env->NewStringUTF("hello everybody 2");
}
//包名+类型
static const char *mClassName = "com/example/myapplication/DyRegister";
//映射到对应的Java函数以及签名
static const JNINativeMethod mMethods[] = {
{"dynamicFunc1", "()V", (void *) func1},
{"dynamicFunc2", "()Ljava/lang/String;", (void *) func2}
};
//实现jni.h的预定义函数,加载Java对应的函数,并且注册Native函数。这个函数内容是一个模板,修改必要参数就行
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved) {
LogE("动态注册开始")
JNIEnv *env = NULL;
//获得JNIEvn
int r = vm->GetEnv((void **) &env, JNI_VERSION_1_4);
if (r != JNI_OK) {
return -1;
}
//获取对应Java类的class
jclass mainActivityCls = env->FindClass(mClassName);
//注册,最后一个参数为注册的方法数,需要动态修改
r = env->RegisterNatives(mainActivityCls, mMethods, 2);
//如果小于0 则注册失败
if (r != JNI_OK) {
return -1;
}
LogE("动态注册结束");
return JNI_VERSION_1_4;
}
新增一个java文件
package com.example.myapplication;
public class DyRegister {
static {
System.loadLibrary("dyTest");
}
public native void dynamicFunc1();
public native String dynamicFunc2();
}
调用的地方
package com.example.myapplication;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class DyRegisterActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DyRegister register = new DyRegister();
register.dynamicFunc1();
String s = register.dynamicFunc2();
System.out.println("运行了:"+s);
}
}
CMake的配置
# 添加lib库
add_library(dyTest SHARED DyRegister.cpp)
# 链接到日志库 如果使用android/log.h 时需要加上
target_link_libraries(dyTest ${log-lib})
运行日志
2023-03-27 11:50:14.422 4641-4641/com.example.myapplication E/QLH: 动态注册开始
2023-03-27 11:50:14.422 4641-4641/com.example.myapplication E/QLH: 动态注册结束
2023-03-27 11:50:14.422 4641-4641/com.example.myapplication E/QLH: dynamicNative1,动态注册
2023-03-27 11:50:14.422 4641-4641/com.example.myapplication E/QLH: dynamicNative2,动态注册
2023-03-27 11:50:14.422 4641-4641/com.example.myapplication I/System.out: 运行了:hello everybody 2