㈠ 如何在Android Studio中導入JNI生成的.so庫
相信很多朋友在使用Android studio開發中,遇到過如何引入第三方so文件的問題,然而第三方官方僅僅給出了ADT環境下的集成方式。
Android studio中默認使用的是gradle編譯方式,與ADT編輯方式不一樣,那麼so文件應當如何引入呢?
其實很簡單。這里以集成JPUSH為例,看一下so文件如何引入到編譯環境,最終到JNI直接可以調用該so文件。
首先,在我們的Mole的根目錄中建立libs目錄,將jpush集成SDK中的so文件分別拷入,截圖如下:

然後就是編寫我們的build.gradle文件。
關於so文件引入的配置很簡單,代碼配置如下:
tasknativeLibsToJar(type:Zip,description:""){
destinationDirfile("$projectDir/libs")
baseName"Native_Libs2"
extension"jar"
fromfileTree(dir:"libs",include:"**/*.so")
into"lib"
}
tasks.withType(JavaCompile){
compileTask->compileTask.dependsOn(nativeLibsToJar)
}
自定義一個任務,在其中指定項目所依賴的so文件的目錄,這里用了**/*.so來寫,為了省事,指定需要拷入的目錄 into "lib",那麼動態運行庫就被拷入到lib目錄中。
完整的build.gradle文件如下:
applyplugin:'com.android.application'
android{
compileSdkVersion21
buildToolsVersion"21.1.0"
defaultConfig{
applicationId"com.wujay.footerballstar"
minSdkVersion8
targetSdkVersion21
versionCode1
versionName"1.0"
}
buildTypes{
release{
runProguardfalse
('proguard-android.txt'),'proguard-rules.pro'
}
}
tasknativeLibsToJar(type:Zip,description:""){
destinationDirfile("$projectDir/libs")
baseName"Native_Libs2"
extension"jar"
fromfileTree(dir:"libs",include:"**/*.so")
into"lib"
}
tasks.withType(JavaCompile){
compileTask->compileTask.dependsOn(nativeLibsToJar)
}
}
dependencies{
compilefileTree(dir:'libs',include:['*.jar'])
compile'com.android.support:appcompat-v7:21.0.0'
compilefiles('libs/jpush-sdk-release1.7.2.jar')
compilefiles('libs/umeng_sdk.jar')
compilefiles('libs/libammsdk.jar')
}
基於有人在評論區提問,這里補充一下,有一個更為快捷輕快的配置方法
那就是在build.gradle配置中,配置如下的信息:
- sourceSets {
- main { jniLibs.srcDirs = ['libs']
- }
- }
你的so包可以放在lib目錄下,跟jar包放在同樣的目錄,如lib/armeabi/libjpush172.so。
㈡ 如何讓android studio 生成的so文件只有arm64-v8a
1.新建一個Project2.創建native方法3.執行Build-MakeProject方法4.命令行生成com_jni_example_NativeUtilsh頭文件5.實現h中的方法6.配置NDK7.打開Project的localproperties文件添加NDK路徑8.打開appMole的buildgradle文件在defaultConfig節點里添加一下代碼並執行同步操作9.生成SO文件10.使用生成SO文件
㈢ android studio JNI開發時 編譯成功 但是沒有生成.so文件 什麼原因
(1)老版本,方法如下:taskNativeLibs(type:Copy){from(newFile(project(':MyProject').buildDir,'native-libs')){include'**/*.so'}intonewFile(buildDir,'native-libs')}tasks.withType(Compile){compileTask->compileTask.dependsOnNativeLibs}clean.dependsOn'cleanCopyNativeLibs'tasks.withType(com.android.build.gradle.PackageApplicationTask){pkgTask->pkgTask.jniDirnewFile(buildDir,'native-libs')}(2)新版本三種方法:(2.1)打包前先生成.Jar文件後自動解包到apk文件tasknativeLibsToJar(type:Zip,description:''){destinationDirfile("$buildDir/native-libs")baseName'native-libs'extension'jar'fromfileTree(dir:'libs',include:'**/*.so')into'lib/'}tasks.withType(Compile){compileTask->compileTask.dependsOn(nativeLibsToJar)}下面一句話就是打包生成目錄(build\native-libs)中的.jar文件compilefileTree(dir:"$buildDir/native-libs",include:'native-libs.jar')(2.2)手動生成.Jar文件後自動解包到apk文件這個方式需要自己手動進行.SO文件壓縮,具體步驟為:將所有需要使用的.so文件壓縮為.zip文件(zip中的文件目錄結構為:lib/armeabi/*.so)然後把zip文件後綴改為.Jar然後放到libs生成apk就ok默認就是自動打包所有.Jar文件:dependencies{compilefileTree(dir:'libs',include:'*.jar')}(2.3)這也就是現在正在使用的方式(推薦),其實無非就是把.SO文件打包到APK的lib文件夾中,假如仔細閱讀了Gradle的使用方法,自然就知道其實Gradle官方在新版已經自動實現了打包.SO文件的.很簡單級就是在配置的android節點下加入下面的內容就ok:sourceSets{main{jniLibs.srcDirs=['libs']}}其他地方無需修改,整個項目的配置文件如下:applyplugin:'android'android{"19.0.0"defaultConfig{"1.0"}buildTypes{release{('proguard-android.txt'),'proguard-rules.txt'}}sourceSets{main{jniLibs.srcDirs=['libs']}}}dependencies{compilefileTree(dir:'libs',include:['*.jar'])}