我使用openTok库进行视频聊天,将libopentok.so
文件放入“libs”下的“armeabi”文件夹中。我的项目已经有jni,它在编译后将自己的文件夹如armeabi,armeabi-v7和mips放入库中,并替换包含libopentok.so
文件的armeabi文件夹。
请告诉我在哪里放置.so文件以及如何访问该文件,谢谢
答案 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
行。