够用的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官网
祝大家玩出花(完)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容