如何从armeabi以外的位置加载共享对象?

时间:2014-09-09 09:04:36

标签: android eclipse android-ndk opentok

我使用openTok库进行视频聊天,将libopentok.so文件放入“libs”下的“armeabi”文件夹中。我的项目已经有jni,它在编译后将自己的文件夹如armeabi,armeabi-v7和mips放入库中,并替换包含libopentok.so文件的armeabi文件夹。

请告诉我在哪里放置.so文件以及如何访问该文件,谢谢

2 个答案:

答案 0 :(得分:1)

您无法从任何其他目录加载.so文件,它们都需要位于同一位置,因为这是唯一一个打包到APK中的目录,并且只安装了APK中的一个单独的库目录在设备上。但是,当您构建自己的代码时,可以确保所有.so文件最终都在同一目录中。

要保留其他预构建的库,您可以将它们放在另一个目录中,并将预构建的库的声明添加到Android.mk中。当您构建自己的代码时,它会自动将预构建的.so文件复制到同一目录中。

请参阅android NDK中有关预建库的文档,也可在https://android.googlesource.com/platform/ndk/+/android-4.4.4_r2.0.1/docs/text/PREBUILTS.text处找到。

答案 1 :(得分:1)

  编译后将 [copy artifacts]复制到libs中并替换包含libopentok.so文件的armeabi文件夹

您不应该替换现有文件夹。相反,您应该将libopentok.so放在Android构建系统所需的相同文件夹中。


  

请让我知道我应该在哪里放置.so文件以及如何访问该文件

我认为您有三个选项来执行复制(而不是替换)。

首先,您可以手动将libopentok.so复制到相应的文件夹中。我过去常常这样做,而不是与Android构建系统作斗争。我曾经使用一个简单收集所有依赖项的脚本,在jni/下创建了目录结构,然后执行了复制。

其次,您可以在构建前或构建后的步骤中使用ant,但我无法帮助您,因为我仍然无法理解XML配置规则(蚂蚁手册页很糟糕)。

第三,你可以使用Android构建系统来完成它。它在Android.mk中看起来像这样。从本质上讲,Android.mk将包含两个组件的指令/配方。

#########################################################
# OpenTok library
include $(CLEAR_VARS)

OPENTOK_INCL   := /usr/local/opentok/$(TARGET_ARCH_ABI)/include
OPENTOK_LIB    := /usr/local/opentok/$(TARGET_ARCH_ABI)/lib

LOCAL_MODULE       := opentok
LOCAL_SRC_FILES    := $(OPENTOK_LIB)/libopentok.so

LOCAL_EXPORT_CPPFLAGS := -Wno-unused
LOCAL_EXPORT_C_INCLUDES := $(OPENTOK_INCL)

include $(PREBUILT_SHARED_LIBRARY)

LOCAL_SHARED_LIBRARIES  := opentok

#########################################################
# MyCoolWarez library
include $(CLEAR_VARS)

APP_MODULES     := mycoolwarez opentok

# My ass... LOCAL_EXPORT_C_INCLUDES is useless
LOCAL_C_INCLUDES   := $(OPENTOK_INCL)

LOCAL_CPP_FLAGS    := -Wno-unused
LOCAL_CPP_FLAGS    += -Wl,--exclude-libs,ALL

LOCAL_LDLIBS            := -llog -landroid
LOCAL_SHARED_LIBRARIES  := opentok

LOCAL_MODULE    := mycoolwarez
LOCAL_SRC_FILES := mycoolwarez.c

include $(BUILD_SHARED_LIBRARY)

通过上面的配置,Android构建系统会将OpenTok复制到与库相同的输出目录中。我相信它归于APP_MODULES := mycoolwarez opentok行。