我目前正在实现一个自定义日志记录机制,我需要从本机代码和Java代码中访问它。日志记录的基本原理是在带有Java包装器的C / C ++中实现的,两者一起构建为一个android库项目。
现在的问题是,虽然我的Java代码可以访问Library项目输出,但我的本机代码似乎没有办法从Library项目访问本机.so或头文件。是否还有一个我缺少的额外步骤,或者这只是当前ADT的限制?更具体地说,是否有一个makefile / eclipse配置,它将解决我以前从图书馆项目中获取的东西? (根据需要构建.so,导入重建.so,导入c / c ++编译的相关头文件等)。
答案 0 :(得分:1)
我不认为这是一个限制。我们应该在Android.mk和Application.mk
中声明本机代码依赖项答案 1 :(得分:0)
找到了获得我想要的方法 - 大部分信息都是(当然)在NDK文档中,但我试图做的并不是ADT中100%支持的。还应该注意的是,我目前仍然在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无法实现。您还需要导出包含链接:
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二进制文件被包含两次(一次来自Library项目的自然导入过程,再次来自import-module
调用)。要解决此问题,请清理磁带库,不要再次构建它! import-module
调用将构建.so并将其导入到项目中。 (显然,如果您的项目只需要Java API,则需要构建.so文件)。恭喜!你有一个功能(如果不是直截了当的)构建过程与混合本机/ Java库