JNI函数动态注册以及示例
新增一个cpp#include #include #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