在android系统的共享库不满意链接.so.12文件 [英] Unsatisfied link for .so.12 file in android shared library

查看:520
本文介绍了在android系统的共享库不满意链接.so.12文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我建立libexif为Android。我使用下面的交叉编译脚本:

I am building libexif for Android. I am using the following cross compile script:

PLATFORM_PREFIX=/home/tishu/Documents/osx-wks/GC/Thdl/jni/libexif-0.6.21/arch-arm/
NDK_PATH=/home/tishu/Documents/android-ndk-r8e/
NDK_PLATFORM=android-14

rmdir $PLATFORM_PREFIX
mkdir $PLATFORM_PREFIX

$NDK_PATH/build/tools/make-standalone-toolchain.sh  --system=linux-x86_64 --platform=$NDK_PLATFORM --install-dir=$PLATFORM_PREFIX

PATH=$PLATFORM_PREFIX/bin:$PATH

./configure --host=arm-linux-androideabi --prefix=$PLATFORM_PREFIX --enable-static
make clean
make install

输出提供3。所以lib文件夹中的文件

The output gives 3 .so files in the lib folder


  • libexif.so(符号链接)

  • libexif.so.12(看起来像一个符号链接,但内容大二进制)

  • libexif.so.12.3.3(实际的二进制)

我已经改名的最后一个文件到libexif.so并删除这两个符号链接按这个网站上发现了一些建议。然后,我想用我的应用程序建立这个并使用以下Android.mk,其中libexif_native是使用libexif库我的C文件

I have renamed the last file to libexif.so and deleted the two symlinks as per some advice found on this website. I then wanted to build this with my app and use the following Android.mk, where libexif_native is my c file that uses the libexif library

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libexif
LOCAL_SRC_FILES := libexif-0.6.21/arch-arm/lib/libexif.so
LOCAL_EXPORT_C_INCLUDES := libexif-0.6.21/arch-arm/include
LOCAL_EXPORT_LDLIBS := libexif-0.6.21/arch-arm/lib/libexif.so
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_ALLOW_UNDEFINED_SYMBOLS=false
LOCAL_MODULE := libexif_native
LOCAL_SRC_FILES := libexif_native1.1.4.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/libexif-0.6.21/arch-arm/include
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_SHARED_LIBRARY := libexif
LOCAL_LDLIBS    := -llog -ljnigraphics -lz -lm $(LOCAL_PATH)/libexif-0.6.21/arch-arm/lib/libexif.so
include $(BUILD_SHARED_LIBRARY)

这编译正确,但是当我在我在调试模式下的手机上运行它,我得到这个错误:

This compiles correctly, but when I run it on my phone in debug mode I get this error:

11-01 15:05:06.919: E/AndroidRuntime(5638): FATAL EXCEPTION: main
11-01 15:05:06.919: E/AndroidRuntime(5638): java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libexif.so.12" needed by "libexif_native.so"; caused by library "libexif.so.12" not found

我又试图此修改Android.mk

I then tried this modified Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libexif
LOCAL_SRC_FILES := libexif-0.6.21/arch-arm/lib/libexif.so
LOCAL_EXPORT_C_INCLUDES := libexif-0.6.21/arch-arm/include
LOCAL_EXPORT_LDLIBS := libexif-0.6.21/arch-arm/lib/libexif.so
LOCAL_EXPORT_LDLIBS := libexif-0.6.21/arch-arm/lib/libexif.so.12
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)
LOCAL_ALLOW_UNDEFINED_SYMBOLS=false
LOCAL_MODULE := libexif_native
LOCAL_SRC_FILES := libexif_native1.1.4.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/libexif-0.6.21/arch-arm/include
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_SHARED_LIBRARY := libexif
LOCAL_LDLIBS    := -llog -ljnigraphics -lz -lm $(LOCAL_PATH)/libexif-0.6.21/arch-arm/lib/libexif.so.12 -lm $(LOCAL_PATH)/libexif-0.6.21/arch-arm/lib/libexif.so.12
include $(BUILD_SHARED_LIBRARY)

由于没有更多的运气。

With no more luck.

任何人都知道为什么它寻找的0.12文件,以及如何通过它?我已经尝试了一些天真的调整,但不能找出如何使这项工作。

Anyone knows why it is looking for the .12 file and how to pass it on? I have tried a few naive tweaks but can't find out how to make this work.

非常感谢

推荐答案

libexif.so 是标准的Andr​​oid发布的一部分。如果你不依赖于最新版本的一些特殊功能,您可能会发现 /system/lib/libexif.so 将只是为你确定。而不是建立图书馆和周围所有的烦恼的工作(见下文),你可以将你的 libexif-native.so 通过系统的lib:简单地从你的设备拉库

The library libexif.so is part of the standard Android distribution. If you don't rely on some special feature of the latest version, you may find that /system/lib/libexif.so will just be OK for you. Instead of building the library and working around all the troubles (see below), you can link your libexif-native.so with the system lib: simply pull the library from your device:

> adb pull /system/lib/libexif.so /somepath

然后插入

LOCAL_LDLIBS += /somepath/libexif.so

Android.mk 。请注意,您会看到

的Andr​​oid NDK:警告:JNI / Android.mk:...:在连接标志非系统库:/somepath/libexif.so

Android NDK: WARNING:jni/Android.mk:...: non-system libraries in linker flags: /somepath/libexif.so

在此情况下,上特有的,可以放心地忽略此警告。

In this speific case, you can safely ignore this warning.

有使用Linux库的Andr​​oid端口一个典型问题,后者使用的版本后缀SONAME,而Android NDK并不支持这样的后缀。这是一个很好的理由:在Android上,图书馆没有安装全系统的,他们总是在应用程序包的一部分,所以版本标记是不必要的。但这种矛盾并没有让Android开发者更轻松。

It is a typical problem with Android port of Linux libraries, that the latter use version suffix for SONAME, while Android NDK does not support such suffix. There is a good reason for that: on Android, libraries are not installed system-wide, they are always part of the application package, and so version tagging is unnecessary. But this inconsistency does not make Android developers' lives easier.

直截了当的决议中提出的 How ?修改Makefile文件librtmp删除版本后缀 的: - 在Makefile地方SONAME = ... 摆脱 -Wl的。不幸的是,这一招不NDK r9d,或R10C工作。

The straightforward resolution was suggested in How to modify librtmp Makefile to remove version suffix?: Get rid of -Wl,--soname=... somewhere in your Makefile. Unfortunately, this trick does not work with NDK r9d, or r10c.

但是,你可以指定额外 LDFLAGS ./配置。下面是命令:

But you can specify extra LDFLAGS for ./configure. Here is the command:

./configure LDFLAGS=-Wl,soname=libexif.so <other parameters>
make
mv /arch-arm/lib/libexif.so.12.3.3 /arch-arm/lib/libexif.so

请注意,您还需要显式地加载从Java的依赖库,以正确的顺序。即静态构造函数看起来像:

Note that you also need to explicitly load the dependency libraries from Java, in the correct order. I.e. a static constructor will look like:

static {
    System.load("/data/data/your.package.name/lib/libexif.so");
    System.loadLibrary("exif-native");
}

您的必须的指定的完整路径 libexif.so ,否则从 /系统库/ lib目录将被载入。

You must specify the full path to libexif.so because otherwise the library from /system/lib will be loaded.

或者,您应该重命名库

Alternatively, you should rename the library

./configure LDFLAGS=-Wl,soname=libexif.12.3.3.so <other parameters>
make
mv /arch-arm/lib/libexif.so.12.3.3 /arch-arm/lib/libexif.12.3.3.so

现在您的Java code可以清洁:

Now your Java code may be cleaner:

    System.loadLibrary("exif.12.3.3");
    System.loadLibrary("exif-native");

和这里的相关片段 Android.mk

LOCAL_MODULE := libexif
LOCAL_SRC_FILES := libexif-0.6.21/arch-arm/lib/libexif.12.3.3.so
LOCAL_EXPORT_C_INCLUDES := libexif-0.6.21/arch-arm/include
include $(PREBUILT_SHARED_LIBRARY)

实际上,一招是我从来不敢尝试可能是手动打包文件 libexif.so.12 资产文件夹,将其解压到一些已知的路径APK安装后,用

Actually, one trick that I never dared to try could be to manually pack the file libexif.so.12 into the assets folder, unpack it to some known path after APK installs, and use

    System.load("/known/path/libexif.so.12");
    System.loadLibrary("exif-native");

这是一个可惜的Andr​​oid包/安装框架执行文件的过滤在库/ armeabi 文件夹,只允许模式 LIB&LT;凡是&GT ;。所以

这篇关于在android系统的共享库不满意链接.so.12文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆