好的,现在我看到了您的编辑,这使得回答具体问题成为可能。
如果您想使用 Android NDK 构建您的原生库,您的应用程序必须至少有一个文件。Android.mk
不过,这不是一个要求。可以通过 Cmake,或带有“传统”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 文件中。另一方面,如果您的库是独立的(例如来自不同的第 3 方),您可能更愿意创建三个 Android.mk 文件。幸运的是,ndk-build
它只是 gnu make 的一个包装器,并且include
Android.mk 中的简单语句与任何其他 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)