jni本地函数重载签名

 2023-01-20    274  

问题描述

我在声明JNI本机函数时尝试使用函数过载.

Java方法是:

jni本地函数重载签名

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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。