簡體   English   中英

從Android Library Project訪問NDK的標頭

[英]Accessing headers for NDK from Android Library Project

我目前正在實現一種自定義日志記錄機制,我需要可以從本機代碼和Java代碼中對其進行訪問。 日志記錄的基礎是使用Java包裝器在C / C ++中實現的,並且兩者一起被構建為android Library Project。

當前的問題是,盡管我的Java代碼可以訪問Library項目的輸出,但是我的本機代碼似乎沒有辦法訪問Library項目的本機.so或標頭。 我是否還缺少其他步驟,或者這僅僅是當前ADT的限制? 更具體地說,是否存在一個makefile / eclipse配置,該配置可以解決我通常習慣於退出圖書館項目的事情? (根據需要生成.so,導入重建的.so,導入相關的標頭以進行c / c ++編譯等)

我不認為這是一個限制。 我們應該在Android.mk和Application.mk中聲明本機代碼依賴性

找到一種方法來獲取我想要的東西-大多數信息(當然)在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庫的功能性(如果不是很簡單)的構建過程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM