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

And*_*kov 21 java-native-interface android-ndk

我有一个NDK库和相应的Java类的工作实现.但我无法将重载方法添加到该类.目前我的班级包含:

package com.package;

public class MyClass
{
  public static native String getFileName();
  static
  {
    System.loadLibrary("mylib");
  }
}
Run Code Online (Sandbox Code Playgroud)

我的jniwrappers.cpp文件有以下声明:

JNIEXPORT jstring JNICALL
Java_com_package_MyClass_getFileName(_JNIEnv* env, jobject thiz);
Run Code Online (Sandbox Code Playgroud)

到目前为止一切正常.但接下来我修改了我的课程:

package com.package;

public class MyClass
{
  public static native String getFileName();
  public static native String getFileName(int index);
  ...
}
Run Code Online (Sandbox Code Playgroud)

并添加到jniwrappers.cpp另一个声明:

JNIEXPORT jstring JNICALL
Java_com_package_MyClass_getFileName__I(_JNIEnv* env, jobject thiz, jint index);
Run Code Online (Sandbox Code Playgroud)

它编译得很好,Android应用程序启动,没有得到UnsatisfiedLinkError,但是当它调用带参数的第二个方法时,第一个C++函数被调用但不是第二个.我在该类中有其他方法参数,但它们都没有重载,所以它们各自的JNI签名不包含参数.

那么,我做错了什么?

st0*_*0le 26

您应该使用javah工具生成这些签名.

要使用它,请构建具有native函数的类文件.你会得到一个class文件.

运行javah -jni com.organisation.class_with_native_func,它会为您生成一个头文件.

它比自己编辑它要清晰得多.

  • 谢谢,这就是我应该使用的.但仍然知道内部是非常有用的. (4认同)

ric*_*chq 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);
Run Code Online (Sandbox Code Playgroud)