我有一个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插件。我究竟做错了什么?
首先,如果您的本机方法确实将ajclass
作为第二个参数,则应static
在Java端对其进行声明。否则,它们应采用jobject
(被调用的实例)而不是jclass
。
这是Oracle文档有关重载本机方法命名的内容:
本机方法名称由以下组件连接而成:...对于重载的本机方法,两个下划线(“ __”)后跟错误的参数签名
因此,第二个函数的名称应为Java_com_example_Test_doSomething__IJ
。您可能还必须将第一个函数的名称更改为Java_com_example_Test_doSomething__I
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句