2012-04-18 9 views
1

を動作していませんメインの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をビルドすることができないようです。どんな助けもありがとう。

答えて

11

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

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

基本的な例は以下の通りである:

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

  • ver:これはライブラリです:libver.so。ソースが含まれています。これは、構築済みのライブラリです:
  • libmagic.so getver:実行可能ファイルが構築されている

ファイルのレイアウト:

[email protected]:~/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 NDK-構築

  • 魔法の一環として建てられました.mk(それはJNIであります/):

    [email protected]:~/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、すべてのLIBSを含むため:

    最後に、libver.soのAndroid.mk(JNI/libsに/ libver/Android.mk)
    [email protected]:~/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 
    

    :上記の例で

    [email protected]:~/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モジュール源の

    [email protected]:~/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 
    

    シミュレート編集:

    [email protected]:~/ndk/sources/getver$ touch jni/getver.c 
    

    リビルド(私はgetver.cソースの変化をシミュレートするためタッチコマンドを使用します)下図の例(libverに注意してください。そうNOT再構築)されている:

    [email protected]:~/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 
    
  • +0

    感謝。非常によく説明されています。 – Jona

    0

    :libver.so源の

    [email protected]:~/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 
    

    シミュレーション編集

    [email protected]:~/ndk/sources/getver$ touch jni/libs/libver/compiled_ver.c 
    

    は、libver.soに依存する(通知getverが再構築される再構築しますより高いレベルのAndroid.mkファイルでは、ディレクトリを再帰的に通過することができます。これをproject/jni/Android.mkに置くと、libAとlibBに入ります。 Android.mkファイルを処理します。あなたの答えのための

    include $(call all-subdir-makefiles)