2023-01-20 274
我在声明JNI本机函数时尝试使用函数过载.
Java方法是:
public native static void methodaaa(String type, int errorCode);
public native static void methodaaa(String type, byte[] byts);
没有超载,该代码如下:
JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa(JNIEnv* env, jobject thiz, jstring type, jint errorCode){}
这很好.
然后我尝试添加过载:
JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa(JNIEnv* env, jobject thiz, jstring type, jint errorCode){}
JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa(JNIEnv* env, jobject thiz, jstring type, jbyteArray buffer){}
这给我带来了错误:
conflicting types for Java_com_xxx_yyy_JavaCallCpp_methodaaa
然后我进行了一些研究,似乎我需要在我想超载的功能的末尾添加一个” __”,并附加了参数名称.
所以我尝试了:
JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa__Ljava_lang_String_I(JNIEnv* env, jobject thiz, jstring type, jint errorCode){}
JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa__Ljava_lang_String_B(JNIEnv* env, jobject thiz, jstring type, jbyteArray buffer){}
但仍然不起作用,错误是:
No implementation found for native Lcom/xxx/yyy/JavaCallCpp;.methodaaa:(Ljava/lang/String;I)V
有人知道如何以jstring为参数编写jnicall函数名称,还是我在这里做错了什么?
任何建议都将不胜感激,谢谢:)
更新:
我在这里找到了链接:
然后尝试修改我的代码:
JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa__Ljava_lang_String_2I(JNIEnv* env, jobject thiz, jstring type, jint errorCode){}
JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa__Ljava_lang_String_2B(JNIEnv* env, jobject thiz, jstring type, jbyteArray buffer){}
但是,我仍然遇到相同的错误:
No implementation found for native Lcom/xxx/yyy/JavaCallCpp;.methodaaa:(Ljava/lang/String;I)V
不要尝试自己弄清JNI方法签名.使用javah的输出.这永远不会错.
也许这会帮助您
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class getter_number_GetNumber */
#ifndef _Included_getter_number_GetNumber
#define _Included_getter_number_GetNumber
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: getter_number_GetNumber
* Method: getNumber
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_getter_number_GetNumber_getNumber__
(JNIEnv *, jobject);
/*
* Class: getter_number_GetNumber
* Method: getNumber
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL Java_getter_number_GetNumber_getNumber__J
(JNIEnv *, jobject, jlong);
/*
* Class: getter_number_GetNumber
* Method: getNumber
* Signature: (FF)F
*/
JNIEXPORT jfloat JNICALL Java_getter_number_GetNumber_getNumber__FF
(JNIEnv *, jobject, jfloat, jfloat);
#ifdef __cplusplus
}
#endif
#endif
原始类型的字段描述符在表中显示.
Java type Field descriptor
boolean Z
byte B
char C
short S
int I
long J
float F
double D
此外,JNI功能名称为C,而不是C ++.他们不能超载.
以上所述是小编给大家介绍的jni本地函数重载签名,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/26061.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态