當前位置:首頁 » 編程軟體 » androidstudio編譯so

androidstudio編譯so

發布時間: 2022-03-16 05:21:01

『壹』 如何讓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)

  • }



  • 自定義一個任務,在其中指定項目所依賴的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庫

在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了。

熱點內容
御龍在天腳本輔助 發布:2025-01-23 11:57:16 瀏覽:886
我的世界電腦版伺服器號碼 發布:2025-01-23 11:57:14 瀏覽:980
小科編程 發布:2025-01-23 11:48:55 瀏覽:673
安卓手機如何禁止未知軟體安裝 發布:2025-01-23 11:47:31 瀏覽:690
腳本我是一 發布:2025-01-23 11:44:27 瀏覽:642
安卓的哈靈麻將哪裡下 發布:2025-01-23 11:26:17 瀏覽:230
全本免費閱讀器在哪緩存 發布:2025-01-23 11:14:54 瀏覽:440
傳輸數據加密 發布:2025-01-23 11:03:20 瀏覽:256
win7文件夾沒有共享 發布:2025-01-23 10:55:43 瀏覽:142
php原鏈接 發布:2025-01-23 10:49:56 瀏覽:515