NDK编程是Android开发的一项重要技能,利用JNI编程可以将许多复杂的处理过程用C/C++来进行,从而提高效率!
不了解JNI的同学可以先看看这里
https://blog.csdn.net/cgwang_1580/article/details/79586710
最近,采用Android Studio来进行ndk开发,由于Android Studio 2.2之后采用cmake的方法来编库,所以在各种文件配置上与Eclipse+ndk有很大的不同,当然与2.2之前的版本也有较大的改变。
这是Android Studio 2.2以上版本开发ndk的一个参考:
http://wl9739.github.io/2016/09/21/%E5%9C%A8-Android-Studio-2-2-%E4%B8%AD%E6%84%89%E5%BF%AB%E5%9C%B0%E4%BD%BF%E7%94%A8-C-C-md/
接着,终于来到本篇文章的核心:
在Android Studio ndk开发中,想在项目中添加一个已经编好的库(lib××××.so),有源文件和头文件;其中,库已经添加,目录也包括了,头文件也已经包含,编译可以通过,但是运行程序时总是crash,错误如下:….couldn’t find “lib××××.so的问题,前面还有很长的部分,但是核心就是这句,可以看出来就是找不到要添加的库lib××××.so;
这是我的CMakeList配置:
include_directories(${COMMON_INC_LIB}/xxxx (头文件位置,没问题)
)
link_directories( ${COMMON_INC_LIB}/common_lib/${ANDROID_ABI}
)
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/main.cpp
src/main/cpp/lib××××.cpp
target_link_libraries(
native-lib
log
xxxx (要添加的库)
)
就是这样的配置,个人觉得好像没有什么问题,但总是crash,终于在万能的CSDN上面找到一些提示,原来我的工程目录下 app/libs/armeabi-v7a中没有把要添加的库放进去,也就是说虽然已经包含了头文件、库目录,但是默认应该是在app/libs中寻找需要的库文件,这是在build.gradle中设定的:
sourceSets{
main{
jniLibs.srcDir(['libs'])
}
}
就是这个语句进行了这样的设定,当然,如果没有将库放进app/lib目录下也是可以的,但是需要在CMakeList中添加拷贝语句:
#copy libxxxx.so to libs
add_custom_command(TARGET native-lib
PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${COMMON_INC_LIB}/xxxx/${ANDROID_ABI}/libxxxx.so ${SO_OUTPUT_PATH}/libxxxx.so
)
终于大功告成!!!