androidso文件生成
❶ 怎麼用jni生成so文件 android studio
task NativeLibs(type: Copy) {
from(new File(project(':MyProject').buildDir, 'native-libs')) { include '**/*.so' }
into new File(buildDir, 'native-libs')
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn NativeLibs }
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.PackageApplicationTask) { pkgTask ->
pkgTask.jniDir new File(buildDir, 'native-libs')
}
(2)新版本三種方法:
(2.1)打包前先生成.Jar文件後自動解包到apk文件
task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
extension 'jar'
from fileTree(dir: 'libs', include: '**/*.so')
into 'lib/'
}
tasks.withType(Compile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
下面一句話就是打包生成目錄(build\native-libs)中的.jar文件
compile fileTree(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 {
compile fileTree(dir: 'libs', include: '*.jar')
}
(2.3)這也就是現在正在使用的方式(推薦) ,其實無非就是把.SO文件打包到APK的lib文件夾中,假如仔細閱讀了Gradle的使用方法,自然就知道其實Gradle官方在新版已經自動實現了打包.SO文件的.很簡單級就是在配置的android節點下加入下面的內容就ok:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
其他地方無需修改,整個項目的配置文件如下:
apply plugin: 'android'
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 16
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
❷ android studio 怎麼生成so文件格式
1.新建一個Project
2.創建native方法
3.執行Build-Make Project方法
4.命令行生成com_jni_example_NativeUtilsh頭文件
5.實現h中的方法
6.配置NDK
7.打開Project的localproperties文件添加NDK路徑
8.打開app Mole的buildgradle文件在defaultConfig節點里添加一下代碼並執行同步操作
9.生成SO文件
10.使用生成SO文件
❸ android studio 怎麼生成so
配置NDK
下載ndk
解壓配置環境變數
驗證配置成功
設置android studio ndk路徑
JNI開發
添加native介面注意寫好native介面和System.loadLibrary()。
執行Build->Make Project,生成了.class文件,.class文件的生成路徑是在 app/build/intermediates/classes/debug下
javah生成c頭文件
點擊」View->Tool Windows->Terminal「,打開終端,進入 \app\src\main的目錄下執行javah命令:
javah -d jni -classpath <SDK_android.jar>;<APP_classes> <class>
然後就看到\app\src\main\jni\com_fy_administrator_jnitoso_JniUtil.h出現了.
1
然後根據.h文件,創建相對應的.cpp文件
創建Android.mk和Application.mk文件
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNIDemo
LOCAL_SRC_FILES := testJni.cpp
LOCAL_SRC_FILES += CAdd.cpp
include $(BUILD_SHARED_LIBRARY)
其中LOCAL_PATH是C/C++代碼所在目錄,也就是我們的jni目錄。
LOCAL_MODULE是要編譯的庫的名稱。編譯器會自動在前面加上lib,在後面加上.so。
LOCAL_SRC_FILES是要編譯的C/C++文件。
Application.mk
APP_ABI := all
#APP_ABI := armeabi armeabi-v7a x86 mips arm64-v8a mips64 x86_64
配置gradle
在defaultConfig下,配置ndk:
ndk {
moleName "JNIDemo" // 生成的so名字
}
在android標簽內配置sourceSets:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
執行ndk-build命令生成所有cpu架構的so庫
❹ 如何獲取android 系統的so庫
android ndk調用第三方的so庫文件的步驟如下:
1.將SO文件直接放到libs/armeabi下,然後代碼中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下來就可以直接調用xxx_xxx_xxx()方法;
2.第二種方案,創建自己的SO文件,在自己的SO文件里調用第三方SO,再在程序中調用自己的SO,這種比較復雜,需要建java類文件,生成.h文件,編寫C源文件include之前生成的.h文件並實現相應方法,最後用android NDK開發包中的ndk-build腳本生成對應的.so共享庫;
❺ android中如何編譯出64位so文件
如果是在Linux下編譯Android源碼,有可能是兩個原因:
1. lunch命令有32位和64位的區別,注意選能夠編譯64位so的命令
2. mk文件中有LOCAL_MODULE_PATH的值比如為$(TARGET_OUT_SHARED_LIBRARIES)/hw的改為LOCAL_MODULE_RELATIVE_PATH := hw,後一種可以分別在lib和lib64下分別生成32位和64位的so文件,這個看看編譯後的信息就知道了.
❻ Android提取so文件並使用
參考 http://billhoo.blog.51cto.com/2337751/1125559
在 http://www.jianshu.com/p/5bebc6dfbdec
這篇文章中征程的apk:JniTest.apk把後綴改為JnitTest.zip,打開這個文件,在lib下面會有生成好的.so文件,出來。
可以發現這個.so文件叫libMyTest.so。
然後把這個so文件到新的項目的libsarmeabi下,使用和正常的.so文件一樣。然後修改app的gradle中的android節點中加入:
然後在mainjava 建立生成.so文件那個項目的包名, 把NdkJniUtils文件過來。當然封裝成jar包更好啦。
到此完成,調用NdkJniUtils的方法即可獲得.so文件中的內容。
❼ 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了。
❽ android studio JNI開發時 編譯成功 但是沒有生成.so文件 什麼原因
1
在交叉編譯的時候怎麼都無法生成so文件,javah生成頭文件沒錯,c文件也沒錯,java文件也沒錯,
2.原因:是JNI文件夾路徑不對
3
在執行javah命令時,我進入的是cd
app/src/main/java
這樣jni文件夾在java文件夾下,作為一個包存在,這樣就無法生成so文件
執行javah的正確姿勢:
4
進入app/src/main目錄:cd
app/src/main
執行javah命令:javah
javah
-d
jni
-classpath
./Java
lab.sodino.jnitest.MainActivity
5,
-d
jni
頭文件生成到jni文件夾(當前在<Project>\app\src\main目錄下,所以.h所在的目錄為<Project>\app\src\main\jni
)
-classpath
./java
指定去當前路徑下java下尋找包名指定的類
這樣再rebuild一下,就會生成so文件了