求Android NDK RegisterNatives完整C++使用示例及相关概念讲解
概念澄清
- 官方示例里的
nativeFoo、nativeBar本质就是C++侧实现的JNI函数,对应Java/Kotlin类中声明的同名native方法。 - 示例中的
MyClass是Java侧声明了native方法的类的全限定类名,作用是让JNI层可以找到要绑定方法的Java类,完成动态注册的映射关联。
完整可运行示例
第一步:Java侧声明native类
假设你的应用包名是com.example.myjnidemo,新建Java类:
package com.example.myjnidemo; public class MyNativeUtils { // 加载原生so库 static { System.loadLibrary("native-lib"); } // 对应C++侧的nativeFoo类实现 public native int nativeAdd(int a, int b); // 对应C++侧的nativeBar类实现 public native String nativeGetHelloStr(); }
第二步:C++侧完整实现(native-lib.cpp)
#include <jni.h> #include <string> // 对应Java nativeAdd方法的C++实现,即示例中nativeFoo的角色 jint nativeAdd(JNIEnv *env, jobject thiz, jint a, jint b) { return a + b; } // 对应Java nativeGetHelloStr方法的C++实现,即示例中nativeBar的角色 jstring nativeGetHelloStr(JNIEnv *env, jobject thiz) { return env->NewStringUTF("Hello from JNI dynamic register!"); } // 方法映射表:三个参数分别为【Java侧方法名】、【方法签名】、【C++侧函数指针】 static const JNINativeMethod gMethods[] = { {"nativeAdd", "(II)I", (void *) nativeAdd}, {"nativeGetHelloStr", "()Ljava/lang/String;", (void *) nativeGetHelloStr} }; // JNI_OnLoad会在so库加载时自动调用,此处完成动态注册逻辑 jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv *env = nullptr; // 获取JNIEnv实例 if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) { return JNI_ERR; } // 找到要注册方法的Java类,即示例中MyClass的位置,全限定名用/替换. const char *className = "com/example/myjnidemo/MyNativeUtils"; jclass clazz = env->FindClass(className); if (clazz == nullptr) { return JNI_ERR; } // 执行注册 int methodCount = sizeof(gMethods) / sizeof(gMethods[0]); if (env->RegisterNatives(clazz, gMethods, methodCount) != JNI_OK) { return JNI_ERR; } // 返回要求的JNI版本 return JNI_VERSION_1_6; }
调用方式
直接在Java业务代码中调用即可:
int sum = new MyNativeUtils().nativeAdd(3, 5); // 得到结果8 String str = new MyNativeUtils().nativeGetHelloStr(); // 得到C++返回的字符串
内容的提问来源于stack exchange,提问作者amaranth
相关产品推荐
相关产品推荐

