Подтвердить что ты не робот

Каков правильный способ записи собственных сигнатур методов в 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, но когда он вызывает второй метод с аргументом, вызывается первая функция С++, но не вторая. У меня есть другие методы с аргументами в этом классе, но ни один из них не перегружен, поэтому их соответствующие подписи JNI не содержат аргументов.

Итак, что я делаю неправильно?

4b9b3361

Ответ 1

Теперь вы должны добавить __ в конец исходной функции 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);

Ответ 2

Вам нужно использовать инструмент javah для генерации этих подписей.

Чтобы использовать его, создайте файл класса, в котором у вас есть функция native. Вы получите файл class.

Запустите javah -jni com.organisation.class_with_native_func, он создаст для вас заголовочный файл.

Он намного чище, чем редактирование.