Каков правильный способ записи собственных сигнатур методов в 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 не содержат аргументов.
Итак, что я делаю неправильно?
Ответы
Ответ 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
, он создаст для вас заголовочный файл.
Он намного чище, чем редактирование.