在Android NDK中编写本机方法签名的正确方法是什么?

时间:2010-10-27 08:37:06

标签: java-native-interface android-ndk

我有一个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签名不包含参数。

那么,我做错了什么?

2 个答案:

答案 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);