gmath为静态库,库文件(.a文件)。
app的CmakeLists.txt文件需要包含下列代码:
1) whether to import libraries as static or shared (using `add_library`)
2) where the library binaries are stored (using `set_target_properties`)
*3)where the library headers are stored (using `target_include_directories`)
java中声明native方法。这些native方法由c++实现。为了让java找到对应的本地实现方法,就需要建立一个对应关系。使用javah工具,自动生成本地头文件。
javah 包名+类名
hello-jni的参考博文(对java类进行javah的步骤):http://lib.csdn.net/article/android/49952
hello-jni的方法1(使用gradle中的ndk):
1、新建JAVA类,声明native函数
2、javah对JAVA类进行编译,生成jni所需的头文件
细化步骤:生成.h.c的cpp类,然后make module,会在build下生成一个路径。
注意:javah之前,要先新建jni文件夹,否者找不到文件。
3、module下新建jni文件夹,存放2生成的头文件,并新建实现文件.c
4、module下的build.gradle中添加ndk的配置,指定生成so动态库的文件名
5、make module
6、在mainavtivity中调用native方法
在java类中声明static library名
hello-jni的方法2(使用cmakelist.txt):
前几个步骤和上面的一样,只有第四步不同。
4、在jni文件夹下新建cmakelist.txt文件,
cmake_minimum_required(VERSION 3.4.1)
add_library(newhellojni SHARED newhellojni.c)
target_link_libraries(newhellojni
android
log)
在module下的build.gradle中添加
externalNativeBuild{
cmake{
arguments '-DANDROID_TOOLCHAIN=clang'
//arguments '-DANDROID_PLATFORM=android-14',
// '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
}
}
externalNativeBuild{
cmake{
path "src/main/jni/CMakeLists.txt"
}
}
真正调用第三方静态库的方法:
1、新建JAVA类,声明native函数
2、javah对JAVA类进行编译,生成jni所需的头文件
细化步骤:生成.h.c的cpp类,然后make
注意:javah之前,要先新建jni文件夹,否者找不到文件。
3.将2生成的头文件拷贝到jni文件下,并在.c文件对声明的native函数进行实现。 也就是在这个.c文件,可以肆意地使用第三方库的方法,记得include
4.在jni文件夹下新建CMakeLists.txt文件,在文件中设置第三方的静态库,设置本地的共享库
cmake_minimum_required(VERSION 3.4.1)
set(libs_DIR ${CMAKE_SOURCE_DIR}/../../../../libs)
#设置第三方库
add_library(lib_gmath STATIC IMPORTED)
set_target_properties(lib_gmath PROPERTIES IMPORTED_LOCATION
${libs_DIR}/gmath-old/lib/${ANDROID_ABI}/libgmath.a)
#设置本地库
add_library(usestatic SHARED
usestatic.c)
target_include_directories(usestatic PRIVATE
${libs_DIR}/gmath-old/include)
target_link_libraries(usestatic
android
lib_gmath
log)
5.在module的gradle.build文件中,增加:
externalNativeBuild {
cmake {
arguments '-DANDROID_PLATFORM=android-14',
'-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
}
}
externalNativeBuild {
cmake {
path 'src/main/jni/CMakeLists.txt'
}
}
6.在工程的settings.gradle文件中,增加: include ':testforstatic' (module名)
另外,CMake的一些命令可以参考博文:http://www.cnblogs.com/tt2015-sz/p/6027662.html