在jni/ndk共享库中未能链接libjpeg.so

3

你好, 我遇到了一个问题,需要构建一个我开发的ndk/jni共享库。我希望重用平台自带的libjpeg (/system/lib/libjpeg.so),但是我无法将其链接起来。当我构建我的共享库时,出现了...

/home/blink/workspace_android2/HackBitmapJNI/jni/jnijpeg/JNIBmp.cpp:94: undefined reference to `jpeg_std_error(jpeg_error_mgr*)'
/home/blink/workspace_android2/HackBitmapJNI/jni/jnijpeg/JNIBmp.cpp:96: undefined reference to `jpeg_CreateDecompress(jpeg_decompress_struct*, int, unsigned int)'
/home/blink/workspace_android2/HackBitmapJNI/jni/jnijpeg/JNIBmp.cpp:98: undefined reference to `jpeg_stdio_src(jpeg_decompress_struct*, __sFILE*)'
/home/blink/workspace_android2/HackBitmapJNI/jni/jnijpeg/JNIBmp.cpp:100: undefined reference to `jpeg_read_header(jpeg_decompress_struct*, int)'
/home/blink/workspace_android2/HackBitmapJNI/jni/jnijpeg/JNIBmp.cpp:102: undefined reference to `jpeg_start_decompress(jpeg_decompress_struct*)'
/home/blink/workspace_android2/HackBitmapJNI/jni/jnijpeg/JNIBmp.cpp:124: undefined reference to `jpeg_read_scanlines(jpeg_decompress_struct*, unsigned char**, unsigned int)'
/home/blink/workspace_android2/HackBitmapJNI/jni/jnijpeg/JNIBmp.cpp:130: undefined reference to `jpeg_destroy_decompress(jpeg_decompress_struct*)'
collect2: ld returned 1 exit status
make: *** [/home/blink/workspace_android2/HackBitmapJNI/obj/local/armeabi/libjnijpeg.so] Error 1*

这基本上是我需要在运行时解析libjpeg.so中的每个符号...

我将libjpeg.so从模拟器复制到我的项目目录下的“lib”文件夹中。当我在该副本上运行“arm-eabi-readelf -s”时,我可以看到所有上述定义的符号(我无法看到方法签名...只有名称...是否有一种方法可以转储签名/命名空间?)

我的Android.mk如下所示...

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_C_INCLUDES := /opt/android_src/dalvik/libnativehelper/include/nativehelper \
                    /opt/android_src/frameworks/base/include \
                    /opt/android_src/system/core/include \
                    /opt/android_src/dalvik/libnativehelper/include \
                    /opt/android_src/external/stlport/stlport \
                    /opt/android_src/external/jpeg \
                    /opt/android_src/bionic
LOCAL_LDFLAGS += -Llib 
LOCAL_MODULE    := jnijpeg
LOCAL_SRC_FILES := JNIBmp.cpp 
LOCAL_LDLIBS    := -lm -llog -ljpeg -landroid_runtime 


include $(BUILD_SHARED_LIBRARY) 

非常感谢您的帮助!

我在SDK或NDK目录中找不到libjpeg.so文件。它确切的位置在哪里?我会尝试将“.so”文件放置到适当的\ndk\build\platforms<android release>\arch-arm\usr\lib目录中。project\libs目录可能只是针对Java构建系统。 - BitBank
你有没有得到答案?因为我也遇到了这种错误。 - Girish Bhutiya
2个回答

2

请尝试使用以下形式的 #include:

extern "C" {
#include "jpeglib.h"
}

对我有用。

祝你好运!


1

我使用以下代码成功地链接了-ljpeg:

LOCAL_LDLIBS := -L$(MYDROID)/out/target/product/generic/system/lib/ -ljpeg


或者,可以从具有兼容 ABI 的模拟器或设备中拉出 /system/lib/libjpeg.so - Alex Cohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接