2015-02-24 2 views
1

Я создал два тестовых проекта, как приложения для Android, использующие JNI.Собственный метод не найден при использовании C++

Для первого я не использовал средства Android Tools/Add native. Нативный метод определен в файле .c с использованием синтаксиса C JNI, и он отлично работает, метод успешно найден и вызван.

Во втором проекте я добавил встроенную поддержку, и я написал собственный код в .cpp-файле, используя синтаксис C++ JNI. В этом случае он не работает, встроенный метод не найден при его вызове.

Я проверил имя метода 1000 раз, оно отлично написано. Проект компилируется должным образом. Также libary также загружен успешно, но метод не может быть найден.

Вот мой Cpp файл:

#include <jni.h> 

JNIEXPORT void JNICALL Java_xxxpackagenamexxx_xxxclassnamexxx_NativeShowMsgBox(JNIEnv * env, jobject jobj, jstring oStr) 
{ 
    // some stuff 
} 

Что это могло быть вызвано? Почему он не работает при использовании C++, когда он работает при использовании C? Что я могу здесь пропустить? Спасибо.

+0

Я думаю, что нашел проблему. Мне пришлось переслать функцию extern C внутри файла .cpp. – Virus721

+0

Используйте 'javah' для создания требуемого файла заголовка. Тогда у вас не будет проблем с сигнатурами. – jww

ответ

2
extern "C" { 
    JNIEXPORT void JNICALL Java_xxxpackagenamexxx_xxxclassnamexxx_NativeShowMsgBox(...) 
    { 
     // some stuff 
    } 
} 
0

Внутренне, C++ компиляторы «» калечить «» имена функций C++ (например, для набора целей), и они должны быть сказано, что данная функция должна быть вызвана как функция C (и, таким образом, не названо его имя).

Дополнительную информацию об использовании CPP в общей библиотеке см. here.

1
#include <jni.h> 

Вы также должны #include сгенерированный файл .h. Выполняет функцию extern "C", а также обеспечивает проверку правильности названия.

0

Я испытал эту проблему, когда типы параметров, указанные в объявлении собственной функции класса Java, не совпадали с типами, объявленными в моем объявлении метода C++. Javah будет генерировать то, что выглядело как правильная запись в файле .h, но компилятор C++ всегда искал имя точки входа. Это были неправильные имена других моих методов, которые были написаны правильно.

В моем случае я проходил длинным [] в своем объявлении метода Java, но использовал jobjectarray в своем объявлении метода C++. Изменение объявления C++ в jlongarray позволило решить проблему, и функция больше не искажалась.

Смежные вопросы