android — JNI注册方法说明

大数据安全 | 期末复习(上)| 补档 大数据定义:无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 阅读详情
Jni中还可以采用RegisterNatives来注册jni的方法,注册以后的jni函数的命名可以不需要符合类似javah命令生成的函数的规则

RegisterNatives为JNIEnv的成员函数,声明为:
    jint (JNICALL *RegisterNatives) (JNIEnv *env, jclass clazz, const JNINativeMethod *methods,jint nMethods);

其对应的取消注册的函数为声明为:
    jint (JNICALL *UnregisterNatives) (JNIEnv *env, jclass clazz);

在java中调用System.loadLibrary("somelib");的时候,系统会自动调用jni的函数JNI_OnLoad,
在程序退出的时候,系统卸载“somelib”,会自动调用jni的函数JNI_OnUnload,
所以我们需要在jni的接口文件中重写这两个函数

以上一篇建立的HelloJni的例子来说明:
先定义一个字符串,内容为类名const char* JNIT_CLASS = "com/example/hellojni/HelloJni";

再定义一个函数的说明的数组

static JNINativeMethod gMethods[] = {
        {"stringFromJNI", "()Ljava/lang/String;",(void*)stringFromJNI},
};

JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *jvm, void *reserved)
{
    JNIEnv *env = NULL;
    if ((*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_4)){
        return JNI_ERR;
    }

    jclass cls = (*env)->FindClass(env, JNIT_CLASS);
    if (cls == NULL)
    {
        return JNI_ERR;
    }
    jint nRes = (*env)->RegisterNatives(env, cls, gMethods, sizeof(gMethods)/sizeof(gMethods[0]));
    if (nRes < 0)
    {
        return JNI_ERR;
    }
    return JNI_VERSION_1_4;
}

JNIEXPORT void JNICALL
JNI_OnUnLoad(JavaVM *jvm, void *reserved)
{
    JNIEnv *env = NULL;
    if ((*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_4)){
        return;
    }
    jclass cls = (*env)->FindClass(env, JNIT_CLASS);
    if (cls == NULL)
    {
        return;
    }
    jint nRes = (*env)->UnregisterNatives(env, cls);
    return;
}

其中JNIT_CLASS 表示的是要调用jni的java类的名称
gMethods[]为RegisterNatives的第三个函数,表示的是所有jni的函数的集合。


JNINativeMethod是表示jni方法的结构体,其结构如下:
typedef struct {
    
     char *name;
     char *signature;
      void *fnPtr;

} JNINativeMethod;

第一个变量name为java类中native函数的名称,
第二个变量signature为java类中native函数的java类型描述,
第三个变量fnPtr为jni中对应的函数名称,格式为类似(void*)MethodName,

函数和变量的java类型描述可以通过命令 javap -s -p classname来获得,classname与使用javah时写的名称一致,javah生成的头文件的每个函数的注释中也有这个描述

对于“()Ljava/lang/String;”一个描述,表示该函数没有参数,返回值为String。括号内的是参数列表,后面跟的是返回值

java中简单类型和jni中的描述的对应关系如下表所示:

Field DescriptorJava Language Type
Zboolean
Bbyte
Cchar
Sshort
Iint
Jlong
Ffloat
Ddouble

对于复杂类型,字符串描述以“L”开头,以“;”结束,例如java中的 String ,在jni中的描述为"Ljava/lang/String;"

对于数组,以“[”开头,接类型描述,例如int[ ],在jni中的描述为“[I”;String[ ], 对应为“[Ljava/lang/String;”;如果是数组维数增加一维,则"["增加一个,例如int[ ][ ],对应为“[[I”;


以上内容具体参见《The Java™ Native  Interface   Programmer’s Guide and Specification》一书,JNI中使用的各类型参见第12章 JNI TYPE


在使用JNI_OnLoad之时,我们不能把classname传递给jni,所以const char* JNIT_CLASS 是一个固定的名称,我们在生成SO文件的同时这个classname就固定下来了,所以,当提供so文件的同时,需要提供一个调用该so文件的java文件,类似c++中提供dll时需要提供的.h文件一样。
【微服务】SpringBoot 整合Kafka 项目实战操作详解 SpringBoot 整合Kafka 实战操作详解 阅读详情

相关推荐

告别版本过低提示!微信3.9登录修复与聊天记录无缝迁移全攻略

本文详细解析了微信3.9版本过低提示的根源,并提供了完整的修复方案和聊天记录迁移指南。通过专用修复工具绕过版本检测,以及新旧版本聊天记录目录对比,帮助用户实现无缝迁移。特别提醒备份重要数据,确保操作安全。

weixin_42535461的博客 3154

【Android】JNI静态与动态注册介绍

JNI(Java Native Interface),即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互.方式静态注册动态注册:需要提供Java中Native方法的方法签名和Native层中对应的实现函数。

微信公众号: 后端码匠 2031

(遇到问题)(已解决)word敲入的公式转化为mathtype

https://www.mathtype.cn/wenti/wordgongshi-zhuanhuan.html 现在越来越多的人在文档中编辑公式的时候会选择MathType来编辑,因为它包含有众多的数学符号和模板,编辑公式时非常方便。但是也有一些人在编辑公式时没有使用MathType公式编辑器,直接使用Word中自带的公式编辑器来编辑的。当我们需要要共享一份文件的时候,这种用自带公式编辑器编辑出来的文件,在我们安装有MathType公式编辑器的电脑里打开时,双击公式没有反应,是无法对它们进行修改的.

计算机视觉 1万+

android JNI学习之静态注册&动态注册

jni的注册

binzai_16的博客 578

【强化学习的数学原理-赵世钰】课程笔记(一)基本概念

在B站上学习强化学习的课程笔记,笔记非常详细清晰,会持续更新

qq_64671439的博客 1万+

Python 使用Pygame库实现足球游戏:创建一个球员和一个足球,并使玩家能够控制球员的移动。游戏将包括碰撞检测、简单的物理模拟,以及基本的用户输入处理

本文将介绍如何使用Python和Pygame库创建一个简单的足球游戏。我们将搭建一个基本的游戏环境,创建一个球员和一个足球,并使玩家能够控制球员的移动。游戏将包括碰撞检测、简单的物理模拟,以及基本的用户输入处理。这个简单的足球游戏展示了Pygame的一些基本功能。虽然这是一个简单的游戏,但它包含了创建游戏循环、用户输入处理、物理模拟、碰撞检测等重要概念。

程序熊的博客 743

Android JNI详解

Android使用JNI的原理解析

疯过无痕的博客 8504

ESD放电路径分析

当金属外壳接地情况下,大部分外部干扰信号将会通过外壳,外壳到接地点,再由接地点回到干扰信号的地,实现干扰信号的回流,这点不仅仅适用于​ESD,对于其他的RI类干扰,也同样适合。发现内部金属板跟外壳的搭接处存在较多的缝隙点,该缝隙点对于频率较高的信号能够实现较为理想的回流,但是对于频率没有那么高的信号,则较难以实现回流,我们尝试将这些缝隙用铜箔包裹住,充分降低该金属板跟外壳的接触阻抗​。我们分析,路径3其实是不期望的路径,我们最期望的路径是1,或者2的内部金属部件跟外壳良好接触情况下的路径。

domen_pan的博客 2228

Android JNI静态注册和动态注册方法详解

这里的JNI静态方式注册方法和JNI的static方法是没有关系的。本文主要介绍jni.cpp代码中动态注册方法的讲解。很多人对这块知识还是比较陌生的,什么是静态注册?什么是动态注册?有些人可能都不清楚。JNI静态注册和动态注册是哪里的代码?什么时候使用静态注册?什么时候使用动态注册?为什么呢?其实一般情况用不到动态注册,但是复杂JNI项目或者系统源码中可能会用到动态注册。特别是系统源码中基本都是用的动态注册的形式,注册JNI方法,所以是有必要进行学习的。

wenzhi的博客 3078

微信小程序:errno: 600001, errMsg: “uploadFile:fail errcode:-101 cronet_error_code:-10001 error_msg:net::E

微信小程序报错uploadFile:fail errcode:-101 cronet_error_code:-10001 error_msg:net::ERR_CONNECTION_RESET, custum ip is invalid, didn't find user's ip,wx.uploadFile errno: 600001 errcode:-101 ?微信小程序wx.uploadFile错误,wx.uploadFile 在真机上报下面的错误,调试工具里没有问题,其它接口在真机/调试工具都正常,

✅ 精选推荐文章 4260

Vue3 - 详解实现网站接入钉钉扫码登录功能,钉钉授权生成登录二维码用户用手机扫描二维码登陆,支持弹框式、浏览器单独新开页显示,钉钉扫描二维码登录详细流程及示例代码,最新vue集成钉钉扫码授权登录!

vue3,nuxt3,钉钉,扫码登录,vue3钉钉扫码登陆,钉钉授权第三方WEB网站扫码登录功能,钉钉扫码登录第三方网站,单点登录,二维码不显示,报错,扫了没反应,出错,vue3钉钉扫码登录,内嵌,获取个人信息,pc网页钉钉登录,钉钉扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描钉钉二维码登录网站,页面弹出一个小窗口而不是打开一个页面,vue3中使用iframe实现另开小窗口扫码登

🏆 前端领域优质创作者 3695

Android JNI 编程之动态注册(设置返回 long float double 型数据)

jni静态注册和 jni动态注册,jni返回double型数据, jni返回float型数据,jni返回long型数据,jni返回java对象,jni返回传递对象 静态注册 理解和使用方式简单, 使用相关工具按流程操作就行, 编码出错率低 JNI 层函数名特别长,且当需要更改类名,包名或者方法时, 需要按照之前方法重新生成头文件, 灵活性不高 初次调用 native 函数时要根据函数...

AlanWang4523 1260

华为OD机考双机位C卷 - 最左侧冗余覆盖子串 (Java)

华为OD机考双机位C卷 - 最左侧冗余覆盖子串 (Java), 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 59

Android下如何通过JNI方法向上提供接口总结

参考文献: http://blog.youkuaiyun.com/luoshengyang/article/details/6575988 http://www.androidmi.com/Androidkaifa/rumen/201005/633.html 1 什么是JNI JNI是Java Native Interface的缩写,即Java本地接口.从Java1.1开始,JNI标准成为Ja

放飞梦想,成就未来 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android JNI原理

Android JNI原理

许浑的博客 1290

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

安卓开发-JNI

JNI(Java Native Interface)是Java本地接口,它允许Java代码和其他语言(通常是C或C++)编写的代码进行交互。JNI的作用是让Java程序能够调用和被C/C++程序调用,从而实现Java与本地代码的互操作性。NDK的主要目的是让开发者能够利用C/C++的性能优势,开发高性能的Android应用。JNI允许Java代码调用C/C++代码,也可以让C/C++代码调用Java代码。静态注册是通过在C++代码中直接实现JNI方法来完成的。动态注册是通过在C++代码中调用。

qq_62784677的博客 1172

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android jni动态注册实例,Android JNI的动态注册

我们知道Androd 使用JNI的注册方法包括两个,静态注册和动态注册。静态注册就是通过javah命令生成.h文件,然后实现声明的函数即可,但此类函数的函数名都比较长:Java+包名+类名+方法名。而动态注册则没有这一限制。先以下面这个例子进行说明,例子中的jni函数参考了Android M源码。我们新建一个的Android工程,包含一个默认的MainActivity。代码如下:package c...

weixin_42305163的博客 397

Android之JNI详解

JNI(Java Native Interface) 是 Java 提供的一种编程框架,用于在 Java 应用程序中调用和与用其他编程语言(如 C、C++ 等)编写的本地代码(Native Code)进行交互。它允许 Java 程序访问操作系统或硬件提供的底层功能。

weixin_39788742的博客 1330

Android开发,使用JNI调用Native方法

JNI 是一种编程接口,允许 Java 代码与其他语言(如 C 或 C++)编写的代码进行交互。这种机制特别适合于需要高性能计算或实时处理的场景,如游戏开发或图像处理,这里以一个简单的图片灰度处理方法作为 JNI 的基本实现例子。

无 1345

android动态注册日志文件,Android JNI和NDK学习(03)--动态方式实现JNI

前面总结了静态实现JNI的方法,本文介绍如何动态实现JNI:JNI在加载时,会调用JNI_OnLoad,而卸载时会调用JNI_UnLoad,所以我们可以通过在JNI_OnLoad里面注册我们的native函数来实现JNI。下面就介绍该方法。1 Android应用层代码在eclipse中新建工程NdkLoad,工程文件NdkLoad.java的代码如下: packagecom.skywang.ndk...

weixin_31459035的博客 125

Android JNI学习(三)——Java与Native相互调用

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法的中文API Android JNI学习(五)——Demo演示 1、注册native函数 2、JNI中的签名 3...

木叶风的博客 302

【安卓Sensor框架-2】应用注册Sensor 流程

Android传感器注册流程解析:当应用层调用SensorManager注册传感器时,首先创建SensorEventQueue对象(事件队列),通过JNI调用nativeEnableSensor()方法。以光传感器为例,DisplayPowerController通过SystemSensorManager注册监听器,在SystemSensorManager中完成参数校验后,创建包含Looper的SensorEventQueue对象,并通过addSensor()方法添加传感器。该队列将传感器事件传递给监听器,

mike_jun的博客 1494

Android JNI 分析

实例参考: MediaScanner.java  (frameworks/base/media/java/android/media/MediaScanner.java) android_media_MediaScanner.cpp (frameworks/base/media/jni/android_media_MediaScanner.cpp    1,  JNI 的调用关系:

tianruxishui的专栏 1825
上一篇: Java instanceof 的用法
下一篇: VelocityTrackerView VelocityTracker 与 Scroller 实现View的滑动
CYoung
博客等级 码龄15年 25粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值