android.mk 编译so库,够用的Android.mk,ndk编译(3)-库的编译和调用

够用的ndk编译系列

库的编译和调用

前面讲了ndk-build的基本目录结构,Application.mk和Android.mk作用。接着讲了编译比较复杂的工程。接下来讲讲怎么编译库。经常有不给源代码的需求,而且还要求库要多次封装,本文就会介绍这个内容。

库的例子

首先看看这次的目录结构:

sample_ndk_build_guide

+---demo

| | build_in_win.cmd

| | install_so_in_win.cmd

| |

| +---jni

| | Android.mk

| | Application.mk

| |

| +---pro_libs

| | fun.h

| | libproject1.so

| | libproject2.so

| | wapperfun.h

| |

| \---src

| demo.c

|

+---project1

| | build_in_win.cmd

| | install_so_in_win.cmd

| |

| +---inc

| | fun.h

| |

| +---jni

| | Android.mk

| | Application.mk

| |

| \---src

| fun1.c

| fun2.cpp

| fun3.c

|

\---project2

| build_in_win.cmd

| install_so_in_win.cmd

|

+---inc

| wapperfun.h

|

+---jni

| Android.mk

| Application.mk

|

+---pro_libs

| fun.h

| libproject1.so

|

\---src

wfun.c

应用的调用关系是这样:demo(exe)->libproject2.so->libproject1.so

编译顺序libproject1.so->libproject1.so->demo(exe)

project1

看看Android.mk,它编一个so,这个so名字叫做libproject1.so

...

LOCAL_MODULE := project1#工程名字,编译出来的目标名字

...

include $(BUILD_SHARED_LIBRARY) #编译成.so文件

project2

接着看libproject2.so编译,依赖libproject1.so,并且应该包含它的头文件目录:

...

#加入第三方(自己的so)

LOCAL_C_INCLUDES += $(PORJECT_INC_PATH)/pro_libs/

LOCAL_LDFLAGS := $(LOCAL_PATH)/pro_libs/libproject1.so

...

如果是包含静态库的话应该这样调用:

...

LOCAL_MODULE := project2#工程名字,编译出来的目标名字

...

#加入第三方(自己的.a)

#定义一个模块,用来描述库文件

include $(CLEAR_VARS)

LOCAL_MODULE := module1#模块名字

#LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libproject1.a#如果架构不同选择

LOCAL_SRC_FILES := ../pro_libs/libproject1.a

include $(PREBUILT_SHARED_LIBRARY)

...

#加入第三方(自己的.a)

LOCAL_STATIC_LIBRARIES += module1

...

demo

最后,看看demo的编译

...

LOCAL_MODULE := demo3#工程名字,编译出来的目标名字

...

#加入第三方(自己的so)

LOCAL_C_INCLUDES += $(PORJECT_INC_PATH)/pro_libs/

LOCAL_LDFLAGS := $(LOCAL_PATH)/pro_libs/libproject2.so

...

include $(BUILD_EXECUTABLE) #编译成一个可执行文件

...

来biu~~biu~~biu~~一下,进入相关目录,biu~~

PS C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project2> cd ..\project1\

PS C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project1> .\build_in_win.cmd

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project1>ndk-build -j -B

jni/Android.mk:33: jni/../inc/

jni/Android.mk:34: jni/../src/fun1.c jni/../src/fun3.c jni/../src/fun2.cpp

[armeabi-v7a] Compile arm : project1 <= fun1.c

[armeabi-v7a] Compile arm : project1 <= fun3.c

[armeabi-v7a] Compile++ arm : project1 <= fun2.cpp

[armeabi-v7a] SharedLibrary : libproject1.so

[armeabi-v7a] Install : libproject1.so => libs/armeabi-v7a/libproject1.so

PS C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project1> .\install_so_in_win.cmd

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project1>xcopy obj\local\armeabi-v7a\libproject1.so .\out\ /Y

obj\local\armeabi-v7a\libproject1.so

复制了 1 个文件

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project1>xcopy inc\fun.h .\out\ /Y

inc\fun.h

复制了 1 个文件

PS C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project1> cd ..\project2\

PS C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project2> .\build_in_win.cmd

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project2>xcopy ..\project1\out\libproject1.so .\pro_libs\ /Y

..\project1\out\libproject1.so

复制了 1 个文件

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project2>xcopy ..\project1\out\fun.h .\pro_libs\ /Y

..\project1\out\fun.h

复制了 1 个文件

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project2>ndk-build -j -B

jni/Android.mk:47: jni/../inc/ jni/../pro_libs/

jni/Android.mk:48: jni/../src/wfun.c

Android NDK: WARNING:jni/Android.mk:project2: non-system libraries in linker flags: jni/../pro_libs/libproject1.so

Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES

Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the

Android NDK: current module

[armeabi-v7a] Compile arm : project2 <= wfun.c

[armeabi-v7a] SharedLibrary : libproject2.so

[armeabi-v7a] Install : libproject2.so => libs/armeabi-v7a/libproject2.so

PS C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project2> .\install_so_in_win.cmd

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project2>xcopy obj\local\armeabi-v7a\libproject2.so .\out\ /Y

obj\local\armeabi-v7a\libproject2.so

复制了 1 个文件

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project2>xcopy inc\wapperfun.h .\out\ /Y

inc\wapperfun.h

复制了 1 个文件

PS C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\project2> cd ..\demo\

PS C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\demo> .\build_in_win.cmd

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\demo>xcopy ..\project1\out\libproject1.so .\pro_libs\ /Y

..\project1\out\libproject1.so

复制了 1 个文件

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\demo>xcopy ..\project1\out\fun.h .\pro_libs\ /Y

..\project1\out\fun.h

复制了 1 个文件

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\demo>xcopy ..\project2\out\libproject2.so .\pro_libs\ /Y

..\project2\out\libproject2.so

复制了 1 个文件

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\demo>xcopy ..\project2\out\wapperfun.h .\pro_libs\ /Y

..\project2\out\wapperfun.h

复制了 1 个文件

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\demo>ndk-build -j -B

jni/Android.mk:47: jni/../inc/ jni/../pro_libs/

jni/Android.mk:48: jni/../src/demo.c

Android NDK: WARNING:jni/Android.mk:demo3: non-system libraries in linker flags: jni/../pro_libs/libproject2.so

Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES

Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the

Android NDK: current module

[armeabi-v7a] Compile arm : demo3 <= demo.c

[armeabi-v7a] Executable : demo3

[armeabi-v7a] Install : demo3 => libs/armeabi-v7a/demo3

PS C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\demo> .\install_so_in_win.cmd

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\demo>xcopy obj\local\armeabi-v7a\demo3 .\out\ /Y

obj\local\armeabi-v7a\demo3

复制了 1 个文件

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\demo>xcopy pro_libs\libproject1.so .\out\ /Y

pro_libs\libproject1.so

复制了 1 个文件

C:\Users\Chaos\Desktop\blog\sample_ndk_build_guide\demo>xcopy pro_libs\libproject2.so .\out\ /Y

pro_libs\libproject2.so

复制了 1 个文件

最后在demo/out生成了demo3,libproject2.so,libproject1.so。

还想深入,可以参考

android官网

祝大家玩出花(完)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值