当前位置: 首页 > article >正文

JNI动态注册

静态注册和动态注册的区别

静态注册

  • 命名规则:
    通常是 Java_ 前缀 + Java 类的全限定名 + 方法名。
  • 注册时机:
    在 JVM 启动加载类时自动完成注册,Java 类中的本地方法直接通过函数名绑定。
  • 注册函数的控制:
    JVM 自动处理

动态注册

  • 命名规则:
    动态注册通过手动调用 JNI 提供的 RegisterNatives 方法将 Java 方法与本地函数绑定。
    不需要遵守特定的命名规则,开发者可以灵活地使用任意名称的 C/C++ 函数,然后在程序启动时(通常在 JNI_OnLoad 函数中)进行注册。

  • 注册时机:
    注册时机由开发者控制,通常在 JNI_OnLoad 函数中调用 RegisterNatives 完成注册。

  • 注册函数的控制:
    手动注册,开发者可以完全控制。

JNINativeMethod结构体

typedef struct {
    const char* name;         // native方法名
    const char* signature;    // 方法签名,例如()Ljava/lang/String;
    void*       fnPtr;        // 函数指针
} JNINativeMethod;

方法签名

  字符串,由一对小括号和若干签名符号组成,其中括号内写传入参数的签名符号,没有参数则不写,括号外写返回参数的签名符号。

签名符号C/C++java
Vvoidvoid
Zjbooleanboolean
Ijnitint
Djdoubledouble
Fjfloatfloat
Bjbytebyte
Cjcharchar
Sjshortshort
[ZjbooleanArayboolean[]
[IjintArrayint[]
[DjdoubleArraydouble[]
[FjfloatArrayfloat[]
[BjbyteArraybyte[]
[CjcharArraychar[]
[SjshortArrayshort[]
L+完整包名+类名jobjectclass

修改native代码

jstring stringFromJNI(
        JNIEnv *env,
        jclass clazz) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}


jstring myFunc(
        JNIEnv *env, jclass thiz,jint i_param){
        std::string retVal = "参数是===>:";
        retVal+=i_param;
    return env->NewStringUTF(retVal.c_str());
}

JNI函数注册(动态注册)

jint JNI_OnLoad(JavaVM* vm,void* reserved){
    JNIEnv *env = NULL;
    if(vm->GetEnv((void**)&env,JNI_VERSION_1_6)!=JNI_OK){
        return -1;
    }
    jclass clazz = env->FindClass("com/example/ndktest/MainActivity");
    JNINativeMethod methods[] = {
            {"stringFromJNI","()Ljava/lang/String;", (void*)stringFromJNI},
            {"myFunc", "(I)Ljava/lang/String;", (void*)myFunc}
    };

    env->RegisterNatives(clazz,methods,sizeof(methods)/sizeof (methods[0]));
    return JNI_VERSION_1_6;
}

JNI函数调用(动态注册)

		Toast.makeText(this,myFunc(97),Toast.LENGTH_SHORT).show();

        TextView tv = binding.sampleText;
        tv.setText(stringFromJNI());


http://www.kler.cn/news/325019.html

相关文章:

  • 【AI大模型】Function Calling
  • 17年数据结构考研真题解析
  • prompt攻击与防范
  • Arrays常用API
  • Java(基本数据类型)( ̄︶ ̄)↗
  • Python中的“锁”艺术:解锁Lock与RLock的秘密
  • Python酷玩之旅_如何连接MySQL(mysql-connector-python)
  • 【Power Compiler手册】13.UPF多电压设计实现(5)
  • 图像处理基础知识点简记
  • HTML5实现好看的唐朝服饰网站模板源码2
  • [Excel VBA]如何使用VBA自动生成图表
  • [论文翻译]基于多模态特征融合的Android恶意软件检测方法
  • 初识Linux以及Linux的基本命令
  • 栏目二:Echart绘制动态折线图+柱状图
  • HCIP——HCIA回顾
  • 华为OD机试 - 对称美学(Python/JS/C/C++ 2024 E卷 100分)
  • MySQL实现按分秒统计数据量
  • android 身份证取景框
  • Python Web 与区块链集成的最佳实践:智能合约、DApp与安全
  • 前端工程记录:Vue2 typescript项目升级Vue3
  • ppt压缩有什么简单方法?压缩PPT文件的几种方法
  • Qt_对话框QDialog的介绍
  • Docker搭建 RabbitMQ 最新版
  • 作业报告┭┮﹏┭┮(Android反调试)
  • Linux安装go-fastdfs
  • 编译安装的 Nginx 设置为服务启动
  • 基于mediapipe深度学习算法的手势数字0-9识别系统python源码+精美GUI界面
  • 9-pg内核之锁管理器(四)常规锁
  • [前端]DOM+CSS+HTML实现水波进度效果
  • SpringBoot 流式输出时,正常输出后为何突然报错?