我有一个使用 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'
Update:
解决方案是在 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");
}
非常感谢 Richard Puckett 提供的这个解决方案。
更新2:
供应商(以及 CY 等固件模组)可能会干扰此 API,因此不应依赖它。