当前位置:网站首页>JNI的 静态注册与动态注册
JNI的 静态注册与动态注册
2022-06-26 17:50:00 【菜鸟xiaowang】
静态注册
按照JNI规范的命名规则进行查找,这种方式叫静态注册
JNI规范书写函数名 Java_定义native方法的全路径_方法名
extern "C" JNIEXPORT jint JNICALL Java_com_example_opentr069_OpenTR069Native_getNatDetected(JNIEnv * env,
jclass clazz){
return sk_get_nat_stun_flag();
}动态注册
调用JNI提供的RegisterNatives函数,将本地函数注册到JVM中,这种方式叫动态注册。
在库加载时会自动调用JNI_OnLoad()函数,开发者经常会JNI_OnLoad()函数做一些初始化操作,动态注册就是在这里进行的。调用API是env->RegisterNatives(clazz, gMethods, numMethods)。
env->RegisterNatives(clazz, gMethods, numMethods)是一个接受三个参数的函数,第一个参数是Java对应的类,第二个参数是JNINativeMethod数组,第三个参数是JNINativeMethod数组的长度,也就是需要注册的方法的个数。
其中JNINativeMethod表示的是方法方法的映射关系,它包括Java中的方法名,对应的方法签名和Native映射的函数方法。
相比静态注册,动态注册的灵活性更高,如果修改了java native函数所在类的包名或类名,仅调整Java native函数的签名信息即可。
// 类库加载时自动调用
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reversed)
{
JNIEnv *env = NULL;
// 初始化JNIEnv
if(vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK){
return JNI_FALSE;
}
// 找到需要动态动态注册的Jni类
jclass jniClass = env->FindClass("com/fly/jnitest/MainActivity");
if(nullptr == jniClass){
return JNI_FALSE;
}
// 动态注册
env->RegisterNatives(jniClass,nativeMethod,sizeof(JNINativeMethod)/sizeof(nativeMethod));
// 返回JNI使用的版本
return JNI_VERSION_1_6;
}
jstring stringFromJNI(JNIEnv *jniEnv,jobject jobj){
return jniEnv->NewStringUTF("hello from C++ string");
}
static const JNINativeMethod nativeMethod[] = {
// Java中的函数名
{"stringFromJNI",
// 函数签名信息
"()Ljava/lang/String;",
// native的函数指针
(void *) (stringFromJNI)
}
};JNI属性描述
JNI属性描述符也就是变量类型在JNI中的表示方式,它是由属性的声明类型决定的。例如使用"I"表示int属性,使用"F"表示float属性,使用"D"表示double属性,使用"Z"表示boolean属性等。
对于引用各类型属性的描述符,比如java.lang.String,需要以字母"L"开头, 解析来是JNI类描述符并使用一个分号结束,Java中完整类名中的".“被”/"替换掉了。因此,对于java.lang.String类型需要使用以下形式的属性描述符:
Ljava/lang/String;
数组类型的描述符由"["以及数组元素类型的描述符组成,例如,[I表示整型数组的属性描述符
函数描述符
通常我们又称为函数签名,一个函数描述符由他的参数类型和返回值类型组成,参数类型在前,且使用一对括号括起来,参数类型是以他们在函数声明中的顺序罗列的,多个参数类型之间是没有分隔符,如果一个方法没有参数,使用一对空的括号表示即可。函数的返回值类型紧跟在包裹参数类型的右括号后边。
例如(I)V代指接收一个整型参数且返回值为空的函数。()D代指的是没有输入参数,返回值是一个double类型的函数。
注意:不要被C函数中像"int f(void)“这样的函数原型误导,误认为”(V)I"是它的方法描述符,其实"()I"才函数f的函数描述符
边栏推荐
- Vue--vuerouter cache routing component
- 【Unity】在Unity中使用C#执行外部文件,如.exe或者.bat
- Leetcode HOT100 (22--- bracket generation)
- 清华&商汤&上海AI&CUHK提出Siamese Image Modeling,兼具linear probing和密集预测性能!
- SIGIR 2022 | 港大等提出超图对比学习在推荐系统中的应用
- Necessary decorator mode for 3 years' work
- 玩轉Linux,輕松安裝配置MySQL
- 你好,现在网上股票开户买股票安全吗?
- Redis and database data consistency
- Notes on flowus
猜你喜欢

9、智慧交通项目(2)
![[ten thousand words summary] starting from the end, analyze in detail how to fill in the college entrance examination volunteers](/img/77/715454c8203d722e246ed70e1fe0d8.png)
[ten thousand words summary] starting from the end, analyze in detail how to fill in the college entrance examination volunteers

Jouer avec Linux et installer et configurer MySQL facilement

并发之线程安全

Leetcode HOT100 (22--- bracket generation)

类型多样的石膏PBR多通道贴图素材,速来收藏!

Play with Linux and easily install and configure MySQL
![[recommendation system learning] recommendation system architecture](/img/a8/448f6e708227555bb6b32cdc652435.png)
[recommendation system learning] recommendation system architecture

Live broadcast preview | how can programmers improve R & D efficiency? On the evening of June 21, the video number and station B will broadcast live at the same time. See you or leave!

Microservice architecture practice: business management background and SSO design: SSO design
随机推荐
mysql Add column 失败 因为之前有数据,不是默认null 不行
Leetcode topic [array] -283- move zero
合约量化系统开发方案详细,量化合约系统开发技术说明
transforms.RandomCrop()的输入只能是PIL image 不能是tensor
分布式缓存/缓存集群简介
非对称密码体制详解
Prometeus 2.34.0 new features
Use middleware to record slow laravel requests
链游系统开发技术方案设计丨NFT链游系统开发流程及源码
玩轉Linux,輕松安裝配置MySQL
小程序设置按钮分享功能
一起备战蓝桥杯与CCF-CSP之大模拟炉石传说
Jouer avec Linux et installer et configurer MySQL facilement
Secrets of gear contract
No manual prior is required! HKU & Tongji & lunarai & Kuangshi proposed self supervised visual representation learning based on semantic grouping, which significantly improved the tasks of target dete
直播预告|程序员进击,如何提升研发效能?6月21日晚视频号、B站同步直播,不见不散!
Inspirational. In one year, from Xiaobai to entering the core Department of Alibaba, his counter attack
What does the equals method compare? Who told you
Notes on flowus
halcon之区域:多种区域(Region)特征(5)