1

次のように編成されたプロジェクトがあります。

project/jni/Android.mk
project/jni/libA/Android.mk
project/jni/libB/Android.mk
project/lib/armeabi/libA.so
project/lib/armeabi/libB.so

libA と libB はメインの Android.mk に設定されています。ビルド済みのライブラリがあるため、メインの Android.mk をビルドするたびにそれらをビルドしたくないからです。ここに私が持っているものがあります:

LOCAL_PATH := $(call my-dir)

###########################################    
# Declare the prebuilt A library    
###########################################
include $(CLEAR_VARS)
LOCAL_MODULE := A-prebuilt
LOCAL_SRC_FILES := ../lib/$(TARGET_ARCH_ABI)/libA.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libA
include $(PREBUILT_SHARED_LIBRARY)

###########################################    
# Declare the prebuilt B library    
###########################################    
include $(CLEAR_VARS)     
LOCAL_MODULE := B-prebuilt    
LOCAL_SRC_FILES := ../lib/$(TARGET_ARCH_ABI)/libB.so    
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libB/include    
include $(PREBUILT_SHARED_LIBRARY)        

###########################################    
# Declare our main module    
###########################################    
include $(CLEAR_VARS)
LOCAL_MODULE := libjnimain    
LOCAL_SRC_FILES := \    
    main.c

# for logging
LOCAL_LDLIBS    += -llog

# include the prebuilt libraries    
LOCAL_SHARED_LIBRARIES := \
A-prebuilt \    
B-prebuilt

#This will include all Android.mk files in sub-directories 
#of the current build file's path.
include $(call all-subdir-makefiles)    
include $(BUILD_SHARED_LIBRARY)

私が抱えている主な問題は、ビルド前のライブラリをビルドすることです。メインの Android.mk が呼び出されるため、Android.mk を呼び出して libA または libB をビルドできないようです。どんな助けでも大歓迎です。

4

2 に答える 2

11

名前が示すように、ビルド済みのライブラリはビルドされません(すでにビルドされています)。ビルド済みのライブラリを再度ビルドする必要がある場合は、ソースを含め、Android.mkを変更して、BUILD_SHARED_LIBRARYを使用してそれらのソースを使用してモジュールを再ビルドする必要があります。ただし、ライブラリソースツリー全体をlibsフォルダに含め、そのAndroid.mkをフォルダに含めることができます。

追加するライブラリは、ソースが変更された場合にのみ構築され、他のモジュールの変更による影響を受けないことに注意してください。

基本的な例は次のとおりです。

まず、プロジェクトのレイアウト。3つのモジュールがあります:

  • ver:これはライブラリです:libver.so。ソースが含まれています。ndk-buildの一部として構築されました
  • magic:これはビルド済みのライブラリです:libmagic.so
  • getver:実行可能ファイルが構築されています

ファイルレイアウト:

sdk@AndroidDev:~/ndk/sources/getver$ find jni/
jni/
jni/getver.c
jni/libs
jni/libs/libver
jni/libs/libver/compiled_ver.c
jni/libs/libver/Android.mk
jni/libs/libver/ver.h
jni/libs/libmagic.so
jni/libs/Android.mk
jni/Android.mk

次に、トップレベルのAndroid.mk(jni /にあります):

sdk@AndroidDev:~/ndk/sources/getver$ cat jni/Android.mk
LOCAL_PATH := $(call my-dir)
my_LOCAL_PATH := $(LOCAL_PATH)

# Include all libs (built and prebuilt)
include $(LOCAL_PATH)/libs/Android.mk

# Build my executable
LOCAL_PATH := $(my_LOCAL_PATH)
include $(CLEAR_VARS)
LOCAL_MODULE    := getver
LOCAL_SRC_FILES := getver.c
LOCAL_SHARED_LIBRARIES= ver magic
include $(BUILD_EXECUTABLE)

jni / libs / Android.mk、すべてのライブラリを含めるため:

sdk@AndroidDev:~/ndk/sources/getver$ cat jni/libs/Android.mk
LOCAL_PATH := $(call my-dir)

# Prebuilt Lib
include $(CLEAR_VARS)
LOCAL_MODULE := magic
LOCAL_SRC_FILES := libmagic.so
include $(PREBUILT_SHARED_LIBRARY)

# Lib to be built as part of building process.
include $(CLEAR_VARS)
include $(LOCAL_PATH)/libver/Android.mk

最後に、libver.soのAndroid.mk(jni / libs / libver / Android.mk):

sdk@AndroidDev:~/ndk/sources/getver$ cat jni/libs/libver/Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := ver
LOCAL_HDR_FILES := ver.h
LOCAL_SRC_FILES := compiled_ver.c
include $(BUILD_SHARED_LIBRARY)

上記の例では、libmagic.soはビルド済みのライブラリであるため、ビルドされることはありません。ただし、libver.soは、libverソースが変更されるたびにビルドされます。getverソースが変更された場合、再構築されません。以下の例(タッチコマンドを使用してgetver.cソースの変更をシミュレートします):

初めてのビルド:

sdk@AndroidDev:~/ndk/sources/getver$ ../../ndk-build
Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Compile thumb  : getver <= getver.c
Compile thumb  : ver <= compiled_ver.c
SharedLibrary  : libver.so
Executable     : getver
Install        : getver => libs/armeabi/getver
Prebuilt       : libmagic.so <= jni/libs/
Install        : libmagic.so => libs/armeabi/libmagic.so
Install        : libver.so => libs/armeabi/libver.so

getverモジュールソースの編集をシミュレートします。

sdk@AndroidDev:~/ndk/sources/getver$ touch jni/getver.c

再構築(libver.soは再構築されないことに注意してください):

sdk@AndroidDev:~/ndk/sources/getver$ ../../ndk-build
Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Compile thumb  : getver <= getver.c
Executable     : getver
Install        : getver => libs/armeabi/getver
Install        : libmagic.so => libs/armeabi/libmagic.so
Install        : libver.so => libs/armeabi/libver.so

libver.soソースの編集をシミュレートします

sdk@AndroidDev:~/ndk/sources/getver$ touch jni/libs/libver/compiled_ver.c

Rebuild(libver.soに依存するため、getverが再構築されることに注意してください。

sdk@AndroidDev:~/ndk/sources/getver$ ../../ndk-build
Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Compile thumb  : ver <= compiled_ver.c
SharedLibrary  : libver.so
Executable     : getver
Install        : getver => libs/armeabi/getver
Install        : libmagic.so => libs/armeabi/libmagic.so
Install        : libver.so => libs/armeabi/libver.so
于 2012-05-03T09:31:27.903 に答える
0

高レベルの Android.mk ファイルに次のものを含めると、ディレクトリを再帰的に通過できます。それを project/jni/Android.mk に置き、libA と libB に入り、それらの Android.mk ファイルを処理します。

include $(call all-subdir-makefiles)
于 2014-03-27T14:19:13.097 に答える