androidstudio編譯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引入第三方so庫,怎麼調不了方法
之前一直沒有做過第三方的推送消息,這次公司要求採用國內極光第三方推送服務,由於項目還在原型圖構思中,因而還可以花點時間看看這方面的東西。
看了下相關的DEMO,挺簡單的,加點許可權,把相關的廣播以及服務注冊一下就好了,然後在application中初始化一下,就解決了。可偏偏這么簡單的幾步,確花了我一點時間去調通。
過濾了相關的log如下
06-21 15:00:53.080 3006-3006/com.soo.jchatdemo E/JPush: [JPushInterface] System.loadLibrary::jpush215java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.soo.jchatdemo-2/base.apk"],nativeLibraryDirectories=[/system/lib, /vendor/lib, system/vendor/lib, system/vendor/lib/egl, system/lib/hw]]] couldn't find "libjpush215.so"
06-21 15:00:53.100 3006-3006/com.soo.jchatdemo W/System.err: at cn.jpush.android.api.JPushInterface.init(Unknown Source)
06-21 15:00:53.100 3006-3006/com.soo.jchatdemo E/JPush: [JPushGlobal] Get sdk version fail![獲取sdk版本失敗!]
06-21 15:00:53.100 3006-3006/com.soo.jchatdemo W/System.err: at cn.jpush.android.api.JPushInterface.init(Unknown Source)
06-21 15:00:53.100 3006-3006/com.soo.jchatdemo E/JPush: [JPushGlobal] JPush .so file do not match JPush .jar file in the project, Failed to init JPush
很
明顯告訴我們,目前缺少了libjpush215.so文件。奇怪的是這so庫已經在我們項目的libs中,之前在eclipse中這樣完全能跑起來的。
問題是Android
Studio目前在打包的時候並沒有在libs中復制SO庫到項目中。因此我們需要在build.gradle中告訴AS執行復制so庫文件。
android {
...
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs']
}
}
}
然後重新Sync Now一下,整個世界都明亮了
『叄』 android studio怎麼生成.so文件
1、編譯環境的搭建
正所謂:「工欲善其事必先利其器」嘛,所以先把改准備工具准備一下,因為是在studio下編譯的,所以啊,什麼studio、什麼sdk、什麼jdk,這些都自己去弄吧,這里說一下ndk這個編譯C文件工具怎麼下載安裝;
下載完了之後直接是一個zip的壓縮包,解壓即可;
然後你會在local.properties文件中看到:
不要急,還沒有完,ndk環境搭建還有最後一步,在gradle.properties的文件末尾加上android.useDeprecatedNdk=true這段代碼:
好了,到此處環境就搭建完畢了。
2、java代碼和C代碼的編寫步驟及過程
首先新建一個java類JNIUtils.java
public class JNIUtils {
static {
System.loadLibrary("huazict");
}
//java調C中的方法都需要用native聲明且方法名必須和c的方法名一樣
public native String getString();
}
然後如下圖所示重新Make Project一下工程:
會在工程目錄E:\work\MyApplication\stujni\build\intermediates\classes\debug\com\huazi\stujni\jni中看到自己編譯後的class文件JNIUtils.class
其次就是生成.h文件了
在studio打開Terminal命令行工具,打開步驟是View->Tool Windows->Terminal
(或直接按Alt+F12
然後在命令行中先進入到工程的main目錄下
輸入命令:javah -d jni -classpath 自己編譯後的class文件的絕對路徑
例如:javah -d jni -classpath
E:\work\MyApplication\stujni\build\intermediates\classes\debug
com.huazi.stujni.jni.JNIUtils(注意debug後的空格)
看到上圖,圖中命令行中是直接進入到了工程的main目錄下(在哪個目錄下運行就會在哪個目錄下自動生成jni文件夾),按回車之後就會在main目錄下生成jni文件夾,同時生成.h文件,
這個文件.h文件不需要做任何修改,默認即可。
現在我們來寫一個test的C文件huazict.c同.h文件一樣放到jni文件夾下,代碼如下:
#include "com_huazi_stujni_jni_JNIUtils.h"
/**
* 上邊的引用標簽一定是.h的文件名家後綴,方法名一定要和.h文件中的方法名稱一樣
*/
JNIEXPORT jstring JNICALL Java_com_huazi_stujni_jni_JNIUtils_getString
(JNIEnv *env, jobject obj) {
return (*env)->NewStringUTF(env, "這是我測試的jni");
}
最後在構建文件中的默認配置中加上:
//ndk編譯生成.so文件
ndk {
moleName "huazict" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結構下的so庫。
}
到這里,通過jni調C就完成了,現在我們來測試一下,寫個TextView顯示一下調用的C:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView)findViewById(R.id.tv);
tv.setText(new JNIUtils().getString());
}
}
ok,沒問題,可以調用,其實也沒有想像中的那麼難,是吧!
三、調用編譯過的.so庫
上邊編譯完成了,有人會問:我要的是編譯後的.so庫,別人用的時候直接拿來用就可以了,那編譯後的.so庫在哪呢?
根據這個路徑就可以找到指定輸出的三種體系結構下的.so庫文件,然後把.so文件復制出來,如下圖所示的放到相應的文件夾下就ok了:
再次運行,結果還是一樣的,跟上邊貼的那張圖的顯示效果是是一樣的,同樣能調用到,代碼我就不上傳了,都在上邊貼上去了,而且也上傳不了,公司的所有文件都是加密的,想上傳都上傳不了。
到這里,整個jni的調用過程就結束了,包括調用jni需要的環境以及調用的過程,最後.so文件的導出,都在上邊了,如果上邊的jni調用過程有什麼問題,歡迎留言,謝謝。
『肆』 android studio怎麼使用so文件
首先,在我們的Mole的根目錄中建立libs目錄,將jpush集成SDK中的so文件分別拷入,截圖如下:
然後就是編寫我們的build.gradle文件。
關於so文件引入的配置很簡單,代碼配置如下:
[html] view plain print?在CODE上查看代碼片派生到我的代碼片
task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {
destinationDir file("$projectDir/libs")
baseName "Native_Libs2"
extension "jar"
from fileTree(dir: "libs", include: "**/*.so")
into "lib"
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
自定義一個任務,在其中指定項目所依賴的so文件的目錄,這里用了**/*.so來寫,為了省事,指定需要拷入的目錄 into "lib",那麼動態運行庫就被拷入到lib目錄中。
『伍』 如何在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)
}
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')
}
- sourceSets {
- main { jniLibs.srcDirs = ['libs']
- }
- }
自定義一個任務,在其中指定項目所依賴的so文件的目錄,這里用了**/*.so來寫,為了省事,指定需要拷入的目錄 into "lib",那麼動態運行庫就被拷入到lib目錄中。
完整的build.gradle文件如下:
基於有人在評論區提問,這里補充一下,有一個更為快捷輕快的配置方法
那就是在build.gradle配置中,配置如下的信息:
你的so包可以放在lib目錄下,跟jar包放在同樣的目錄,如lib/armeabi/libjpush172.so。
『陸』 android studio怎麼配置編譯so庫
在app的build文件中,注意不是整個project的build.gradle文件中的android{}中加入
sourceSets{
main{
jniLibs.srcDirs=['libs']
}
}
就行了。然後把so文件夾armeabi添加到libs中就行了。不用打包了
『柒』 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'])}
『捌』 android studio 怎麼引用.so 文件
在java目錄的同級目錄新建一個文件夾,命名為「JniLibs」,然後把要導入的so包復制到這個文件夾,然後重新編譯項目,您的so庫文件就會被自動引入到項目中了,希望能幫到您。
『玖』 android studio怎麼導入so
相信很多朋友在使用Android studio開發中,遇到過如何引入第三方so文件的問題,然而第三方官方僅僅給出了ADT環境下的集成方式。
Android studio中默認使用的是gradle編譯方式,與ADT編輯方式不一樣,那麼so文件應當如何引入呢?
其實很簡單。這里以集成JPUSH為例,看一下so文件如何引入到編譯環境,最終到JNI直接可以調用該so文件。
http://blog.csdn.net/wulianghuan/article/details/44567001
『拾』 android studio中怎麼打包.so庫文件
首先在Android Studio工程的app目錄下創建整個jni目錄,jni目錄里寫Android.mk、Application.mk以及各類C/C++和匯編源文件。然後跟原來一樣,用ndk_build工具去編,然後工具會自動生成libs目錄,裡面還有每個你在Application.mk里所指定處理器架構的so文件。
完成之後,編輯你對應mole(類似eclipse中的project)目錄下的build.gradle文件,為其添加以下代碼:
[html] view plain
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
比如本人mole完整的build.gradle文件如下所示:
[html] view plain
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "21.1.1"
defaultConfig {
applicationId "com.example.way.aligesture"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':acra')
compile project(':hwdroid')
}
最後記得選中對應的mole右擊synchronize同步一下,以便使其生效。如下圖所示,mole目錄下回生成一個jniLibs目錄,再打包生成的apk就會帶上.so了。