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 <jni.h>

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

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

1 ответ

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");

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

#include <jni.h>
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.

Другие вопросы по тегам