2014-08-01 1 views
0

У меня был уже настроенный .so файла, мой Android.mk является:Android NDK - Как работать вызвать другую скомпилированную библиотеку

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 файл, как я это исправить ?

+0

Простым способом является загрузка Java-кода в другую библиотеку. –

ответ

0

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.

+0

Отлично, но как я могу назвать функцию в C? всегда возвращается для меня «неизвестное имя типа foo» – user3900816

+0

Вам не нужно «foo». префикс. Компилятор найдет, что 'getBoo()' реализуется в этой библиотеке. Вам нужно объявление функции в вашем C-коде, см. Обновление (формат комментария не позволяет использовать образцы кода). –

 Смежные вопросы

  • Нет связанных вопросов^_^