Я пытаюсь использовать NDK с C ++ и, похоже, не могу правильно сформулировать соглашение об именах методов. мой родной метод выглядит следующим образом:
extern "C" {
JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni
(JNIEnv* env, jclass c)
{
//
}
}
с заголовком, заключенным в extern "C" {} также.
Все компилируется нормально, создается файл .so и копируется в папку libs в моем проекте, но когда я отлаживаю и запускаю в Eclipse, я продолжаю получать сообщение журнала cat, что "не найдено реализации для native ...". Что-то мне не хватает, поскольку все примеры NDK написаны на C?
Спасибо.
android
android-ndk
Патрик Кафка
источник
источник
javah
? Если нет, то должно быть. :-PSystem.loadLibrary
Ответы:
Есть несколько вещей, которые могут привести к тому, что «реализация не найдена». Один неправильно понимает имя прототипа функции, другой вообще не может загрузить .so. Вы уверены,
System.loadLibrary()
что этот метод вызывается до использования метода?Если у вас не определена
JNI_OnLoad
функция, вы можете создать ее, и она выдаст сообщение журнала, чтобы убедиться, что библиотека успешно загружается.Вы уже избежали наиболее распространенной проблемы - забыли использовать
extern "C"
- так что это либо вышеупомянутое, либо небольшая орфография. Как выглядит декларация Java?источник
Дополнительная причина этой ошибки: ваше недекорированное имя собственного метода не должно содержать подчеркивания!
Например, я хотел экспортировать функцию C с именем
AudioCapture_Ping()
. Вот моя экспортная декларация на C:JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapture_Ping(JNIEnv *pJniEnv, jobject object); //Notice the underscore before Ping
Вот мой класс Java, импортировавший функцию:
package com.obsidian.mobileaudiohashhost; ... public class MainActivity extends Activity { private native int AudioCapture_Ping(); // FAILS ...
Я не мог заставить Android динамически связываться с моим собственным методом, пока я не удалил подчеркивание:
JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapturePing(JNIEnv *pJniEnv, jobject object); package com.obsidian.mobileaudiohashhost; ... public class MainActivity extends Activity { private native int AudioCapturePing(); // THIS WORKS! ...
источник
У меня была такая же проблема, но для меня ошибка была в файле Android.mk. Я имел его:
но должно быть это:
обратите внимание на деталь + = вместо : =
Надеюсь, это поможет.
источник
Вызывается extern «C», как указано в автоматически созданном примере Studio, но забыл заключить весь остальной файл, включая следующие функции, в квадратные скобки {}. Работала только первая функция.
источник
Дополнительная причина: используйте LOCAL_WHOLE_STATIC_LIBRARIES вместо LOCAL_STATIC_LIBRARIES в android.mk. Это не позволяет библиотеке оптимизировать неиспользуемые вызовы API, поскольку NDK не может обнаружить использование собственных привязок из кода Java.
источник
В приложениях в ndk есть пример cpp: https://github.com/android/ndk-samples/blob/master/hello-gl2/app/src/main/cpp/gl_code.cpp
источник
Используйте javah (часть Java SDK). Его инструмент именно для этого (генерирует заголовок .h из файла .class).
источник
Если имя вашего пакета включает символ _, вы должны написать 1 (один) после символа _, как показано ниже:
MainActivity.java
package com.example.testcpp_2;
native-lib.cpp
источник
Я пробую все вышеперечисленные решения, но никто не может решить мою ошибку сборки (jni java.lang.UnsatisfiedLinkError: реализация для ... не найдена), наконец я обнаружил, что забыл добавить исходный файл verify.cpp в CMakeList.txt add_library segement (verify.cpp автоматически создается с помощью короткой клавиши Ctrl + Enter, возможно, с другим именем файла), надеюсь, мой ответ может кому-то помочь.
моя среда сборки: Gradle + CMake
источник
Я столкнулся с той же проблемой, и в моем случае причина заключалась в том, что у меня было подчеркивание в имени пакета «RFID_Test». Я переименовал пакет, и он сработал. Спасибо user1222021
источник
Я дважды сталкивался с одной и той же проблемой. Случилось так, что телефон, на котором я пытался запустить приложение из Android Studio, использовал уровень API, который я еще не загрузил в Android Studio.
источник