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