1

我目前正在实现一个自定义的日志记录机制,我需要可以从本机代码和 Java 代码访问该机制。日志记录的基础是在 C/C++ 中使用 Java 包装器实现的,两者一起被构建为一个 android 库项目。

手头的问题是,虽然我的 Java 代码可以访问 Library 项目的输出,但我的本机代码似乎没有办法从 Library 项目中访问本机 .so 或标头。我是否缺少其他步骤,或者这只是当前 ADT 的限制?更具体地说,是否有一个 makefile/eclipse 配置可以解决我通常用来摆脱图书馆项目的事情?(根据需要构建.so,导入重建的.so,导入相关头文件进行c/c++编译等)

4

2 回答 2

1

我不认为这是一个限制。我们应该在 Android.mk 和 Application.mk 中声明本机代码依赖项

于 2012-09-05T20:21:40.753 回答
0

想出了一种方法来获得我想要的东西——大部分信息(当然)在 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 库的功能性(如果不是直截了当的话)构建过程

于 2012-09-06T22:45:05.503 回答