Java 如何实现两个名称相同但参数不同的JNI方法?

Java 如何实现两个名称相同但参数不同的JNI方法?,java,java-native-interface,Java,Java Native Interface,我有一个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); } 我的头文件看

我有一个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_
只有一个函数可以工作,但在添加第二个具有相同名称和不同参数的函数后,我得到一个错误:

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插件。
我做错了什么?

首先,如果您的原生方法真的将
jclass
作为第二个参数,那么它们应该在Java端声明为
static
。否则,它们应该采用
jobject
(调用它们的实例),而不是
jclass


下面是关于重载本机方法命名的说明:

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


因此,第二个函数的名称应该是
Java\u com\u example\u Test\u doSomething\u IJ
。您可能还必须将第一个函数的名称更改为
Java\u com\u example\u Test\u doSomething\u I

使用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
/*不要编辑此文件-它是机器生成的*/
#包括
/*类com_示例_测试的标题*/
#ifndef包括了com示例测试
#定义\u包含\u com\u示例\u测试
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*类别:com_示例_测试
*方法:剂量测定法
*签字:(一)五
*/
JNIEXPORT void JNICALL Java_com_示例_测试_doSomething_I
(JNIEnv*,jobject,jint);
/*
*类别:com_示例_测试
*方法:剂量测定法
*签字:(IJ)V
*/
JNIEXPORT void JNICALL Java_com_示例_测试_doSomething_IJ
(JNIEnv*,jobject,jint,jlong);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫

这不是我的项目代码,所以我忘记了static关键字,但是谢谢你的回答它可以工作=)你为什么不使用
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