Android Studio如何为第二个Activity配置通过JNI调用原生C++代码
解决Android项目新增Activity无法调用原生JNI代码的方案
出现该问题的核心原因通常是原生so库未在当前Activity加载,或是JNI函数命名和声明native方法的类路径不匹配,按以下步骤操作即可解决:
步骤1:加载原生so库
Android Studio默认生成的项目仅会在MainActivity中添加so库加载逻辑,新增的Activity需要补充该配置,在SecondActivity的伴生对象中添加加载代码即可:
class SecondActivity : AppCompatActivity() { companion object { init { // *库名必须和CMakeLists.txt中project指令定义的名称完全一致* System.loadLibrary("native-lib") } } // 声明需要调用的native方法 external fun getNativeString(): String }
优化方案:可以将so库加载逻辑放到自定义Application类的静态代码块中,App启动时全局加载一次,所有页面都可直接调用原生方法,无需每个Activity重复配置。
步骤2:匹配JNI函数命名(静态注册场景)
JNI静态注册要求函数名和声明native方法的全类名严格对应,默认生成的C函数是适配MainActivity的,新增Activity后需要补充对应命名的原生函数:
比如你的SecondActivity全类名为com.example.myapp.SecondActivity,声明的native方法名为getNativeString,对应的C函数写法如下:
extern "C" JNIEXPORT jstring JNICALL Java_com_example_myapp_SecondActivity_getNativeString(JNIEnv* env, jobject thiz) { return env->NewStringUTF("Hello from SecondActivity JNI!"); }
注意:包名中的点要替换为下划线,类名和方法名要和Kotlin代码中完全一致
步骤3:推荐使用动态注册(可选)
如果需要多个类调用同一个原生方法,可使用动态注册避免重复写多份命名不同的函数,示例代码如下:
#include <jni.h> #include <string> // 通用原生方法实现 jstring commonGetString(JNIEnv* env, jobject thiz) { return env->NewStringUTF("Common JNI string"); } // 方法映射表 static const JNINativeMethod gMethods[] = { {"getNativeString", "()Ljava/lang/String;", (void*)commonGetString}, }; JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = nullptr; if (vm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) { return JNI_ERR; } // 给MainActivity注册方法 jclass mainClazz = env->FindClass("com/example/myapp/MainActivity"); env->RegisterNatives(mainClazz, gMethods, sizeof(gMethods)/sizeof(gMethods[0])); // 给SecondActivity注册方法 jclass secondClazz = env->FindClass("com/example/myapp/SecondActivity"); env->RegisterNatives(secondClazz, gMethods, sizeof(gMethods)/sizeof(gMethods[0])); return JNI_VERSION_1_6; }
校验排查项
- 修改C++代码后必须重新编译项目再运行,避免缓存导致调用失败
- 若抛出
UnsatisfiedLinkError异常,优先排查so库是否加载、JNI函数名是否匹配、方法签名是否正确三个点 - 确认app模块的build.gradle中CMake/NDK配置为全局生效,无针对特定页面的特殊限制
内容的提问来源于stack exchange,提问作者John Alway
相关产品推荐
相关产品推荐

