调用内Android.mk文件构建prebuilt库不工作 [英] Calling inner Android.mk file to build prebuilt libraries not working

查看:410
本文介绍了调用内Android.mk文件构建prebuilt库不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经组织如下项目:

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

我的力霸和libB都在我的主要Android.mk设置为prebuilt库,因为我不希望他们建造每次我建我的主要Android.mk时间做。以下是我有:

My libA and libB are set on my main Android.mk as prebuilt libs cause I don't want them to be built every time I build my main Android.mk. Here is what I have:

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)

我的主要问题是建设prebuild库。我似乎无法能够通过调用它们的Andr​​oid.mk,因为当我这样做的主要Android.mk被称为建立力霸或libB。任何帮助将是AP preciated。

The main problem I have is building the prebuild libraries. I can't seem to be able to build the libA or libB by calling their Android.mk because when I do the main Android.mk is called. Any help would be appreciated.

推荐答案

随着顾名思义,prebuilt库将永远不再建造(他们已经建成)。如果您需要重新构建prebuilt库,您将需要包括其来源和改变你Android.mk使用这些资源重新构建这些模块,使用BUILD_SHARED_LIBRARY。但是,您可以包括整个库源代码树成文件夹,包括它的Andr​​oid.mk到你的。

As the name suggests, the prebuilt libraries will never be built (they are already built). If you need to build the prebuilt libraries again, you will need to include their sources and change you Android.mk to use those sources to build those modules again, using BUILD_SHARED_LIBRARY. However, you can include the whole library source tree into a libs folder and include it's Android.mk into yours.

请注意,您添加的库只建成,如果他们的源代码更改,而且没有获得受其他模​​块改变。

一个基本的例子如下:

第一项目的布局。有3个模块:

First the layout of the project. There are 3 modules:


  • 版本:这是一个图书馆:libver.so。来源包括在内。建成NDK-构建的一部分

  • 魔法:这是一个prebuilt库: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 /):

Next, the toplevel Android.mk (it's in 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的/库/ Android.mk,为包括所有库:

The jni/libs/Android.mk, for including all libs:

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

最后,Android.mk libver.so的(JNI /库/ libver / Android.mk):

Finally, Android.mk of libver.so (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是永远不会被建造的,因为它是一个prebuilt库。然而,libver来源更改libver.so将建每次。 它不会,如果getver来源更改重建。如下图所示的例子(我用的触摸的命令,以模拟getver.c来源的变化):

In the above example, the libmagic.so is never going to be built, as it is a prebuilt lib. However, libver.so will be built everytime libver sources change. It will not be rebuilt if getver sources change. Illustrated example below(I use touch command to simulate change in getver.c source):

第一次编译:

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模块源代码编辑:

Simulate editing of getver module sources:

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源编辑

Simulate editing of libver.so sources

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

重建(通知getver重建,因为它依赖于libver.so:

Rebuild(notice getver is rebuilt as it depends on 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  : 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

这篇关于调用内Android.mk文件构建prebuilt库不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆