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?

Благодарю.

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

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

Вы уже уклонились от самой распространенной проблемы – забыв использовать 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 

Вот мой class 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. Я имел его:

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

но должен иметь следующее:

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

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

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

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

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

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

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

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

Я столкнулся с той же проблемой, и в моем случае причина заключалась в том, что у меня был знак подчеркивания в имени пакета «RFID_Test», который я переименовал в пакет, и он сработал. Спасибо пользователю1222021

Если ваше имя пакета содержит символ _, вы должны написать 1 (один) после символа _, как показано ниже:

MainActivity.java

 package com.example.testcpp_2; 

нативной lib.cpp

 JNICALL Java_com_example_testcpp_12_MainActivity_stringFromJNI( 

Я столкнулся с той же проблемой дважды. Случилось так, что в телефоне, который я пытался запустить приложение из Android Studio, использовался уровень API, который я еще не загрузил в Android Studio.

  1. Обновите Android Studio до последней версии
  2. Загрузите необходимый API из Android Studio
  • Android: как программно найти имя версии Android?
  • Файловые операции в Android NDK
  • SQLite с Android NDK
  • Как воспроизводить несколько видеофайлов одновременно в одном макете бок о бок в другом представлении на Android
  • Ошибки индексатора Eclipse при использовании STL с Android NDK
  • Добавление предварительно созданных файлов .so в проект с помощью плагина Android Gradle 0.7.3
  • Как связать предварительно созданную общую библиотеку с проектом Android NDK?
  • Создание продукта SDK: как добавить собственный lib (.so) и банку с SDK, который я создаю?
  • Запуск автономной библиотеки на Android L. Ошибка: поддерживаются только независимые исполняемые файлы (PIE)
  • Что такое sharedUserId в Android и как оно используется?
  • Eclipse успешно компилируется, но все же дает семантические ошибки
  • Давайте будем гением компьютера.