想出了一种方法来获得我想要的东西——大部分信息(当然)在 NDK 文档中,但我试图做的并不是 100% 支持 ADT。还应该注意的是,我目前被困在 Windows 环境中进行开发,因此在 Linux 中这可能更容易或不必要。第一个键是$(call import-module ...)
宏。在您的库项目中,将源文件和 Android.mk 文件夹移动到您以后可以找到的命名目录中。我的图书馆项目目录如下所示:
MyProject
> src
> res
v jni
- Application.mk
v MyLib
- source.cpp
- source.h
- Android.mk
我还必须编辑我的 Application.mk 以指向该项目:
APP_PROJECT_PATH := <path-to-my-project>
APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/jni/MyProject/Android.mk
令人讨厌的是,这以无法预料的方式破坏了我的 Android.mk,直到我将 a 添加./
到我的源文件中。您还需要导出包含以进行链接:
LOCAL_SRC_FILES := ./source.cpp
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
确保系统路径变量NDK_MODULE_PATH
设置为包括您的库的 JNI 目录,例如<path-to-my-project>/jni
(注意:我这样做后必须重新启动 eclipse)。
在接收应用程序的 Android.mk 文件(您希望本地链接到您的应用程序的文件)中,导入模块:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := MyNativeProject
LOCAL_SRC_FILES := source.cpp
LOCAL_CFLAGS := -DANDROID_NDK -g -std=c99
LOCAL_SHARED_LIBRARIES := MyLib
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
$(call import-module, IntelLog)
此时一切都已完美构建,但 APK 打包器不喜欢生成的 .so 二进制文件被包含两次(一次来自库项目的自然导入过程,另一次来自import-module
调用)。要解决这个问题,请清理库并且不要再次构建它!该import-module
调用将构建 .so 并将其导入您的项目。(显然,如果您的项目只需要 Java API,则需要构建该 .so 文件)。恭喜!你有一个使用混合原生/Java 库的功能性(如果不是直截了当的话)构建过程