You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 12:45:03