我有一个NDK库和相应的Java类的工作实现。但我无法将重载方法添加到该类。目前我的班级包含:
package com.package;
public class MyClass
{
public static native String getFileName();
static
{
System.loadLibrary("mylib");
}
}
我的jniwrappers.cpp文件有以下声明:
JNIEXPORT jstring JNICALL
Java_com_package_MyClass_getFileName(_JNIEnv* env, jobject thiz);
到目前为止,一切正常。但接下来我修改了我的课程:
package com.package;
public class MyClass
{
public static native String getFileName();
public static native String getFileName(int index);
...
}
并向jniwrappers.cpp添加另一个声明:
JNIEXPORT jstring JNICALL
Java_com_package_MyClass_getFileName__I(_JNIEnv* env, jobject thiz, jint index);
编译好,Android应用程序启动,没有得到UnsatisfiedLinkError,但是当它调用带参数的第二个方法时,第一个C ++函数被调用但不是第二个。我在该类中有其他带参数的方法,但它们都没有重载,所以它们各自的JNI签名不包含参数。
那么,我做错了什么?
答案 0 :(得分:26)
您应该使用javah
工具生成这些签名。
要使用它,请构建具有native
功能的类文件。您将获得class
个文件。
运行javah -jni com.organisation.class_with_native_func
,它会为您生成一个头文件。
它比自己编辑它要清晰得多。
答案 1 :(得分:22)
您必须在原始getFileName函数的末尾添加__
,因为它已经过载。你的2 C函数原型现在应该是这样的:
JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__
(JNIEnv *, jclass);
JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__I
(JNIEnv *, jclass, jint);