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