【发布时间】:2017-04-20 02:52:01
【问题描述】:
我有一个名为“ABC”的安卓应用程序,它需要打包一个名为“libxxx-jni.so”的 jni 共享库。所以源码树如下:
ABC
+- Android.mk
+- java
+- res
+- jni
+- Android.mk
+- xxx.cpp
ABC应用的Android.mk是:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_PACKAGE_NAME := ABC
LOCAL_SRC_FILES := $(call all-java-files-under, java)
LOCAL_RESOURCE_DIR += \
$(LOCAL_PATH)/res
LOCAL_JNI_SHARED_LIBRARIES := libxxx-jni
include $(BUILD_PACKAGE)
# Also build sub-targets under this one: the shared library.
include $(call all-makefiles-under, $(LOCAL_PATH))
而jni库xxx的Android.mk为:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libxxx-jni
LOCAL_SRC_FILES := xxx.cpp
LOCAL_SHARED_LIBRARIES := \
libutils \
libcutils
LOCAL_LDLIBS += -llog
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE)
include $(BUILD_SHARED_LIBRARY)
我把这些源码放在android aosp源码树中,使用android构建环境构建整个系统。
我的问题是我需要将 libxxx-jni.so 打包到我的设置 apk 中。目前,构建完成后,我看到 libxxx-jni.so 位于 /system/lib。在 APK 的 lib 子文件夹中,我只看到 /system/lib/libxxx-jni.c 的链接。
这不是我的期望。我想将 so 打包到我的 APK 的 lib 子文件夹中,而不仅仅是一个链接。而且我不希望libxxx-jni.so出现在/system/lib中。
我没有使用 IDE(eclipse 或 android studio),我只在 aosp 源码树中使用 Android.mk。
我应该如何修改这些 Android.mk 以满足我的期望?谢谢。
【问题讨论】:
-
AOSP 构建确实如您所描述的那样工作:您构建的应用程序被视为 系统应用程序,它所依赖的所有本机库都安装到
/system/lib。这是有道理的,因为这个应用程序永远不会被安装,并且pm 将没有机会提取打包的本机库,就像普通 APK 发生的那样。 -
您可以在
aapt命令的帮助下将任何文件添加到您的APK,参见stackoverflow.com/a/23655436/192373。
标签: android makefile android-ndk android-build android-install-apk