У меня есть приложение, которое использует jnigraphics, но мне нужно, чтобы оно было доступно для Android 2.1 (так как у ~ 25% пользователей это все еще есть.) Я пытаюсь связать его, но у меня возникают проблемы со связыванием.
Мой Android.mk выглядит следующим образом:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jnigraphics-prebuilt
LOCAL_SRC_FILES := lib/libjnigraphics.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := yyy
LOCAL_SRC_FILES := yyy.c
LOCAL_SHARED_LIBRARY := jnigraphics-prebuilt
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LDLIBS += -lm -llog
#LOCAL_CFLAGS += -O3
include $(BUILD_SHARED_LIBRARY)
Теперь он распознает #include <android/bitmap.h>
(я получал сообщение об ошибке перед добавлением строк C_INCLUDES), но, похоже, не связывает библиотеку,потому что при сборке я получаю неопределенные ссылки на символы, которые в (очевидно) успешно включенном заголовочном файле:
Prebuilt : libjnigraphics.so <= jni/lib/
Install : libjnigraphics.so => libs/armeabi/libjnigraphics.so
Compile thumb : yyy <= yyy.c
SharedLibrary : libyyy.so
/home/xxx/w/zzz/obj/local/armeabi/objs/yyy/yyy.o: In function `Java_yyy_yyy_yyy_MainActivity_yyy':
/home/xxx/w/zzz/jni/yyy.c:143: undefined reference to `AndroidBitmap_getInfo'
Обновление:
Решение состоит в том, чтобы обеспечить обакаталог, содержащий библиотеку в LDLIBS -L и имя библиотеки в LDLIBS -l, например:
LOCAL_LDLIBS += -L$(PROJECT_PATH)/libs/$(TARGET_ARCH_ABI)/ -ljnigraphics -lm -llog
Вы также должны загрузить вновь внедренную библиотеку в класс, где выиспользуйте его, например:
public native static byte[] doYYY(Bitmap bitmap); static {
System.loadLibrary("jnigraphics");
System.loadLibrary("yyy");
}
Большое спасибо Ричарду Пукетту за это решение.
Обновление 2:
Возможно, что поставщики (имодов прошивки типа CY) может помешать остроумиеh этот API, поэтому от него не следует зависеть.