Android NDK – как функционировать вызов другой предварительно построенной библиотеки

У меня был предварительно встроенный файл .so, мой Android.mk:

LOCAL_MODULE := hello LOCAL_SRC_FILES := libfoo.so hello.c LOCAL_ALLOW_UNDEFINED_SYMBOLS := true include $(BUILD_SHARED_LIBRARY) 

Теперь, я хочу, как построить hello.c, который вызывает функцию (getBoo – находится в файле libfoo.so)

Что я до сих пор:

 #include  jstring Java_com_example_getBoo( JNIEnv* env,jobject this,jstring x ) { return foo.getBoo(x); } 

Что, очевидно, не ссылается на файл libfoo.so, как я могу это исправить?

Android.mk :

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello.c LOCAL_SHARED_LIBRARIES := foo_prebuilt include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := foo_prebuilt LOCAL_SRC_FILES := libfoo.so include $(PREBUILT_SHARED_LIBRARY) 

Не забывайте, что ваш Java-код должен загружать две библиотеки в правильном порядке:

 System.loadLibrary("foo"); System.loadLibrary("hello"); 

Вам также требуется объявление функции для удовлетворения компилятора C.

 #include  extern int getBoo(int); jint Java_com_example_getBoo(JNIEnv* env, jobject this, jint x) { return getBoo(x); } 

Я ожидал, что вы знаете имена экспортируемых функций из libfoo.so . Во всяком случае, в NDK есть команда nm ( ndk\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-nm.exe ). Запустите его с -D и у вас есть этот список. Обычно мы используем файлы заголовков, которые поставляются с библиотеками, которые мы используем для предоставления форвардных объявлений.

Я вижу, что ваш оригинальный пример намеревается принять строковый аргумент и вернуть строку. Это добавляет еще один уровень сложности, пожалуйста, прочитайте книгу JNI о том, как JNI обрабатывает строки Java.