3

必要な Android メイク ファイルを動的に作成する CMake スクリプトに基づいて Android NDK ビルドをセットアップしようとしています。JNI フォルダー構造を使用することはできませんが、ビルド プロセスをいくつかの個別の make スクリプトに分割しました。

最初に、プロジェクト ルートにあるルート Android.mk ファイルを作成します。

#ANDROID ROOT MAKEFILE

LOCAL_PATH := D:/binrev/repository/bar
include $(CLEAR_VARS)

MY_LOCAL_CFLAGS := -DDEBUG
include D:/binrev/repository/bar/src/Android.mk

2. プロジェクト ソース フォルダーにソース Android.mk ファイルを作成し、モジュール ビルドを実行します。

$(info "[INFO] Source Makefile invoked")

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE    := bar
LOCAL_C_INCLUDES:= D:/binrev/repository/bar/include
LOCAL_SRC_FILES :=  bar.cpp

ifeq (debug,"debug")
   MY_LOCAL_CFLAGS := -DDEBUG
endif

ifeq (false,true)
   LOCAL_ARM_MODE := arm
endif

LOCAL_EXPORT_C_INCLUDES := D:/binrev/repository/bar/include

LOCAL_LDLIBS := -llog 
LOCAL_LDLIBS += -landroid

LOCAL_STATIC_LIBRARIES += foo 

ifeq (OFF, ON)
   include $(BUILD_SHARED_LIBRARY)
else
   include $(BUILD_STATIC_LIBRARY)
endif

基本的にこのメカニズムは機能し、ソースをコンパイルできますが、ライブラリのプリビルドを含めようとすると失敗します。スタティック ライブラリのプレビルドを含めるために、次の方法を試しました (変更されたソース/インクルード定義を使用)。

include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := lib/android/$(TARGET_ARCH_ABI)/libfoo.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY) 

1 つ目 ソース Android.mk ファイル内のプリビルド定義 2 つ目 import-module メカニズムを呼び出し、Prebuild Android.mk ファイルを prebuild-lib に追加 3 つ目 ルート Android.mk ファイル内のプリビルド定義

[編集:] これも失敗する call-import テストの抜粋です: $(info "[INFO] Source Makefile invoked")

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE    := bar
LOCAL_C_INCLUDES:= D:/binrev/repository/bar/include
LOCAL_SRC_FILES :=  bar.cpp

ifeq (debug,"debug")
    MY_LOCAL_CFLAGS := -DDEBUG
endif

ifeq (false,true)
    LOCAL_ARM_MODE := arm
endif

LOCAL_EXPORT_C_INCLUDES := D:/binrev/repository/bar/include

LOCAL_LDLIBS := -llog 
LOCAL_LDLIBS += -landroid

LOCAL_STATIC_LIBRARIES += foo 

ifeq (ON, ON)
   include $(BUILD_SHARED_LIBRARY)
else
   include $(BUILD_STATIC_LIBRARY)
endif

$(call import-module, external-deps/foo)

いずれの場合も、ビルド前定義を含むスクリプトが呼び出されますが、ビルド前は実行されません。NDK ビルドが完了しても、ビルド前のライブラリとオブジェクトが obj フォルダーにコピーされません。プリビルドは完全に無視されているようです。ただし、ビルド前のソースへのパスは正しいです。そうしないと、ファイルが見つからないというエラーでコンパイルが失敗します。

このテスト実装の完全なソースは、[テスト プロジェクト][1] https://sourceforge.net/projects/binrevengine/files/publications/で入手できます。

ヒント: bar プロジェクトは、foo プロジェクトをプリビルドしようとするプロジェクトです。foo プロジェクトにはビルド前のソースが含まれています。

追加されたテスト プロジェクトは、GCC 4.7/4.8 で MinGW64 を使用して、CMake と事前にインストールされた NDK (r8e を使用) とのハンドシェイクで独自にビルドできます。

私は完全に迷子になり、アイデアが不足しています...助けてくれてありがとう。

4

2 に答える 2