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 <jni.h>
extern int getBoo(int);
jint Java_com_example_getBoo(JNIEnv* env, jobject this, jint x)
{
return getBoo(x);
}
Я ожидал, что вы знаете имена экспортируемых функций от libfoo.so
. Во всяком случае, есть nm команда в NDK (ndk\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-nm.exe
). Запустите его с -D
, и у вас есть этот список. Обычно мы используем заголовочные файлы, которые приходят с библиотеками, которые мы используем для предоставления форвардных объявлений.
Я вижу, что ваш первоначальный пример намерен принять строковый аргумент и вернуть строку. Это добавляет еще один уровень сложности, пожалуйста, прочитайте книгу JNI о том, как JNI обрабатывает строки Java.
Простым способом является загрузка Java-кода в другую библиотеку. –