這里寫代碼片Android開發常常遇到Java調用so文件的情況,本文介紹一下Google最近新推出的應用在android studio中的方法–cmakelist.txt格式調用。
so文件分為jni格式的和非jni格式的,java只能調用jni格式的so文件。本文介紹的是針對ndk生成的非jni格式的so文件調用。
首先是對非jni格式的so文件進行處理,聲明一個.h文件,將so文件中的方法包進去,之后將.h文件和so文件放在一個目錄下(之后需要對目錄進行設置),在系統生成的native-lib.cpp中實現對該so文件的調用,即將.h文件包進去就可以調用so文件中的方法。java采用
System.loadlibraty("native-lib")
的方法,即可對native-lib.cpp方法的調用。
下圖是我實例的結構圖:

其關鍵是CMakeList.txt和app下的gradle的設置
gradleandroid {
compileSdkVersion 24
buildToolsVersion “24.0.3”
defaultConfig {
applicationId “com.zfq.anew”
minSdkVersion 19
targetSdkVersion 24
versionCode 1
versionName “1.0”
#設置so文件的ABI類型
abiFilters 'armeabi' //abiFilters 'armeabi', 'armeabi-v7a' } testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { arguments '-DANDROID_PLATFORM=android-19', '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static' } } }
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } // 設置so文件路徑 sourceSets { main { // let gradle pack the shared library into apk //jniLibs.srcDirs = ['../distribution/plus/lib'] //jniLibs.srcDirs =[] jniLibs.srcDirs = ['../distribution/plus/lib'] } } //設置cmakelist路徑 externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:24.2.1' testCompile 'junit:junit:4.12' }
下面是CMakelist設置
cmake_minimum_required(VERSION 3.4.1) **#設置cmakelist的目標路徑``** set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution) #增加Cpp動態共享庫 add_library( native-lib SHARED native-lib.cpp ) #增加so文件動態共享庫,${ANDROID_ABI}表示so文件的ABI類型的路徑 add_library(wzh033 SHARED IMPORTED) set_target_properties(wzh033 PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/plus/lib/${ANDROID_ABI}/libwzh033.so) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") #增加include包含的路徑 target_include_directories(native-lib PRIVATE ${distribution_DIR}/plus/include) #生成鏈接動態庫 target_link_libraries( native-lib wzh033 android ${log-lib} )
參考文獻:
(locationNum=6http://blog.csdn.net/eastmoon502136/article/details/52806640)
http://blog.csdn.net/ddjjll8877/article/details/52670097?
https://developer.android.com/studio/projects/add-native-code.html#new-project
