Как правильно написать собственный метод подписи в Android NDK? - PullRequest
21 голосов
/ 27 октября 2010

У меня есть рабочая реализация библиотеки 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 ]

26 голосов
/ 02 ноября 2010

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

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

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

Это намного чище, чем редактировать его самостоятельно.

22 голосов
/ 27 октября 2010

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