Android NDK C ++ JNI (нет реализации для родных …)

Я пытаюсь использовать NDK с C ++ и, похоже, не верю в правильность именования методов. Мой собственный метод выглядит следующим образом:

extern "C" { JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni (JNIEnv* env, jclass c) { // } } 

С заголовком, завернутым в extern «C» {}.

Все компилируется отлично, создает файл .so и копирует в папку libs в моем проекте, но когда я отлаживаю и запускаю в Eclipse, я продолжаю получать сообщение cat cat о том, что «никакой реализации не найдено для native …». Есть ли что-то, что мне не хватает, поскольку все примеры NDK находятся на C?

Благодарю.

Solutions Collecting From Web of "Android NDK C ++ JNI (нет реализации для родных …)"

Есть несколько вещей, которые могут привести к «не найденной реализации». Один получает неправильное имя прототипа функции, другое не загружает .so вообще. Вы уверены, что System.loadLibrary() вызывается перед использованием метода?

Если у вас нет определенной функции JNI_OnLoad , вам может понадобиться ее создать, и она JNI_OnLoad сообщение журнала, чтобы убедиться, что lib успешно завершен.

Вы уже уклонились от самой распространенной проблемы – забыв использовать extern "C" – так это либо выше, либо немного неправильного написания. Как выглядит Java-объявление?

У меня была та же проблема, но для меня ошибка была в файле Android.mk. Я имел его:

 LOCAL_SRC_FILES := A.cpp LOCAL_SRC_FILES := B.cpp 

Но должен иметь это:

 LOCAL_SRC_FILES := A.cpp LOCAL_SRC_FILES += B.cpp 

Обратите внимание на деталь + = вместо : =

Надеюсь, это поможет.

Дополнительная причина для этой ошибки: ваше имя непринятого нативного метода не должно содержать подчеркивания!

Например, я хотел экспортировать функцию 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! ... 

Дополнительная причина: используйте LOCAL_WHOLE_STATIC_LIBRARIES вместо LOCAL_STATIC_LIBRARIES в android.mk. Это останавливает библиотеку от оптимизации неиспользуемых вызовов API, поскольку NDK не может обнаружить использование собственных привязок из java-кода.

Используйте javah (часть Java SDK). Его инструмент точно для этого (генерирует заголовок .h из файла .class).

Вызывается extern «C», как указано в примере с автоматически созданным Studio, но забыл обернуть весь оставшийся файл, включая следующие функции, в {} скобках. Работала только первая функция.

Я пробовал все вышеперечисленные решения, но никто не смог решить мою ошибку сборки (jni java.lang.UnsatisfiedLinkError: нет реализации, найденной для …), наконец я обнаружил, что забыл добавить исходный файл verify.cpp в CMakeList.txt Add_library segement (verify.cpp автоматически сгенерируется с помощью Ctrl + Введите короткий ключ, возможно, другое имя файла), надеюсь, что мой ответ может помочь кому-то.

Моя среда сборки: Gradle + CMake