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文件了