2012-01-12 53 views
4

这个问题似乎已经被问了很多,但都试图使用eclipse来打包APK中的库。 但是,我的要求是使用Android构建系统将库包装到APK中(稍后将使用System.loadLibrary()通过Java加载),即,我想编写一个执行此项工作的Android.mk文件。如何在APK中打包预构建的共享库

要求: 1.预建共享库:libTest.so 2.写一个Android.mk文件,将打包这对库/ armeabi-7的APK内部。

对于我正在使用的编译系统我不太了解,但是导出所需环境变量后使用“mm”命令完成编译。

当我为LOCAL_JNI_SHARED_LIBRARIES提供libTest时,它会尝试在其导出的路径中找到它,并无法在其中找到它,因此构建失败。

任何人都可以请给任何指示写一个Android.mk文件,将我的预构建共享库打包到APK中?

回答

2

为了预生成您的本机库,你必须

  1. 在你的项目文件夹中创建jni文件夹
  2. 在你的项目文件夹中创建libs文件夹
  3. 添加Adnroid.mk make文件的JNI文件夹,它应该看起来像 这样:

    LOCAL_PATH := $(call my-dir) 
    
    include $(CLEAR_VARS) 
    
    LOCAL_LDLIBS := -llog 
    LOCAL_MODULE := Test 
    LOCAL_SRC_FILES := Test.cpp 
    
    include $(BUILD_SHARED_LIBRARY) 
    

注1:Test.cpp是包含本地方法实现的主库源文件。您可以将更多来源添加为空格分隔列表。

注2:不要包含标题,它们会自动包含。注意3:如果需要启用C++ STL,则创建另一个make文件 - Application.mk,将其添加到jni文件夹中,并在其中设置APP_STL := stlport_static标志。

然后,你将不得不建立一个建设者。请参考this article如何做到这一点:

完成这些步骤后,构建器将在libs文件夹中创建您的库,该文件夹将在构建整个应用程序时自动打包到apk中。

注意:您的库名应该是小写,它是一个Linux约定。 “lib”前缀将自动添加,因此最终的库名称将为libtest.so。

0

比方说,有一个libxxx.so共享库,在libs/armeabi/项目,你想打包到apk中。有需要在Android.mk下面做两件事情:

# 1. Copy .so to out/target/product/***/obj/lib 
$(shell cp $(wildcard $(LOCAL_PATH)/libs/armeabi/*.so $(TARGET_OUT_INTERMEDIATE_LIBRARIES)) 

# 2. Make libxxx to be packed into apk 
LOCAL_JNI_SHARED_LIBRARIES := libs/libxxxx 


然后你可以使用apktool解包内置APK,你会发现libxxx.so将位于libs/armeabi*/。它确实包装到apk中。

相关问题