如何使用Android NDK以正确的依赖顺序构建多个项目?

时间:2013-02-17 16:47:15

标签: android eclipse android-ndk

我有一系列现有的库,我需要在Android应用程序中重复使用。布局类似于:

  

\库\ libOne
  \ Libraries \ libTwo [静态库]
  \库\ libThree
  \ Applications \ MyApplication \ [Application]

libTwo取决于libOnelibThree取决于libTwo。如何让构建系统以正确的顺序构建所有库?我正在尝试使用Eclipse,但如果需要,我可以使用命令行。

所有这些库最终都将被Java应用程序引用(并使用JNI与它们进行交互)。关于如何设置Android.mk / Application.mk文件的任何线索?

我尝试将BUILD_STATIC_LIBRARY用于libTwo,但实际上并没有输出任何文件!我期待一个libTwo.a文件,但没有任何东西被编译或构建。

我是否在应用程序中编写了一个Android.mk?或者每个项目的Android.mk?

2 个答案:

答案 0 :(得分:3)

好的,现在我看到你的编辑了,这使得回答具体问题成为可能。

如果您想使用Android NDK构建本机库,必须至少有一个Android.mk文件。但这不是必需的。可以通过Cmake或者#34;独立工具链来构建它。用"传统" makefile,或使用MS Visual Studio插件,或任何其他方式。结果很重要。结果是使用兼容的编译器为仿生运行时构建的共享对象。

将库置于${project_root}/libs/armeabi/目录(对于ARM v6兼容设备,x86,MIPS,arm v7a的其他子目录)以允许APK构建器正确打包它,以便允许应用程序安装程序解压缩正确的版本(与设备处理器兼容)到设备上的/data/data/${package_name}/lib目录,最后能够使用System.loadLibrary(short_name)从Java中使用它。但也很有可能以不同的方式打包so文件,手动解压缩,并从设备文件系统的任何位置加载它(假设您的应用程序有权写入和读取此文件)。

但如果我们过滤掉异国情况,那么在${project_root}/jni目录中安装Android.mk会更舒服。就ndk-build命令而言,每个库都是一个单独的MODULE,但所有三个都可以在一个Android.mk文件中定义。另一方面,如果您的库是孤立的(例如来自单独的第三方),您可能更愿意创建三个Android.mk文件。幸运的是,ndk-build只不过是gnu make的包装器,Android.mk中的简单include语句与其他任何makefile一样。

总之,您的案例可能包含在一个简单的Applications/MyApplication/ [Application]/jni/Android.mk文件中:

include ../../Libraries/libOne/Android.mk
include ../../Libraries/libTwo/Android.mk
include ../../Libraries/libThree/Android.mk

我不知道你在libOne和libTwo之间有什么依赖关系,但是对于libOne,文件Libraries/libOne/Android.mk看起来像

LOCAL_PATH = $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := libOne
LOCAL_SRC_FILES := first.c
include $(BUILD_STATIC_LIBRARY)

Libraries/libThree/Android.mk

LOCAL_PATH = $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := libThree
LOCAL_SRC_FILES := third.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libOne $(LOCAL_PATH)/../libTwo
LOCAL_STATIC_LIBRARIES := libOne libTwo
include $(BUILD_SHARED_LIBRARY)

您应该从ndk-build目录运行Applications/MyApplication/ [Application] - 从命令提示符运行,或通过Eclipse ADT插件运行。

更新同样可以由Android.mk目录中的一个jni文件表示:

LOCAL_PATH = ../../Libraries/libOne
include $(CLEAR_VARS)
LOCAL_MODULE    := libOne
LOCAL_SRC_FILES := first.c
include $(BUILD_STATIC_LIBRARY)

LOCAL_PATH = ../../Libraries/libThree
include $(CLEAR_VARS)
LOCAL_MODULE    := libThree
LOCAL_SRC_FILES := third.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libOne $(LOCAL_PATH)/../libTwo
LOCAL_STATIC_LIBRARIES := libOne libTwo
include $(BUILD_SHARED_LIBRARY)

答案 1 :(得分:0)

项目属性中有一个android部分,您可以在其中编辑库依赖项。如果libOne libTwo和libThree在其属性面板中标记为库,则只能使用它。