繁体   English   中英

如何实现两个具有相同名称但不同Params的JNI方法?

[英]How can i implement two JNI methods with same name but different Params?

我有一个java类,有两个本地函数,名称相同但参数不同。

package com.example;

public class Test {

    static {
        System.loadLibrary("TestLib");
    }

    public static native void doSomething(int a);
    public static native void doSomething(int a, long b);
}

我的头文件看起来像

#include <jni.h>

#ifndef _TEST_LIB_H_
#define _TEST_LIB_H_

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL Java_com_example_Test_doSomething
    (JNIEnv *env, jclass clazz, jint a);

JNIEXPORT void JNICALL Java_com_example_Test_doSomething
    (JNIEnv *env, jclass clazz, jint a, jlong b);

#ifdef __cplusplus
}
#endif

#endif //_TEST_LIB_H_

和我的cpp文件

#include "TestLib.h"

JNIEXPORT void JNICALL Java_com_example_Test_doSomething
    (JNIEnv *env, jclass clazz, jint a){
    Java_com_example_Test_doSomething(env, clazz, a, -1);
}

JNIEXPORT void JNICALL Java_com_example_Test_doSomething
    (JNIEnv *env, jclass clazz, jint a, jlong b) {
    // implementation
}

它只有一个功能,但在添加第二个具有相同名称和不同参数的功能后,我得到一个错误:

error: conflicting declaration of C function 'void Java_com_example_Test_doSomething(JNIEnv*, jclass, jint, jlong)'
note: previous declaration 'void Java_com_example_Test_doSomething(JNIEnv*, jclass, jint)'

我正在使用android studio和实验gradle插件。 我究竟做错了什么?

使用javah工具生成头文件,下面是此工具将为您的类生成的内容。

首先使用它编译.java文件,然后在.class文件上运行javah。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_Test */

#ifndef _Included_com_example_Test
#define _Included_com_example_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_Test
 * Method:    doSomething
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_com_example_Test_doSomething__I
  (JNIEnv *, jobject, jint);

/*
 * Class:     com_example_Test
 * Method:    doSomething
 * Signature: (IJ)V
 */
JNIEXPORT void JNICALL Java_com_example_Test_doSomething__IJ
  (JNIEnv *, jobject, jint, jlong);

#ifdef __cplusplus
}
#endif
#endif

首先,如果您的本机方法确实将jclass作为其第二个参数,那么它们应该在Java端声明为static 否则,他们应该使用jobject (它们被调用的实例)而不是jclass


以下是Oracle的文档中有关重载本机方法命名的说明:

本机方法名称由以下组件连接:...用于重载的本机方法,两个下划线(“__”)后跟受损的参数签名

所以你的第二个函数的名字应该是Java_com_example_Test_doSomething__IJ 您可能还必须将第一个函数的名称更改为Java_com_example_Test_doSomething__I

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM