当前位置:首页 » 编程软件 » 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 12:44:56 浏览:17
广州电信上传速度 发布:2025-01-23 12:43:22 浏览:896
怎么清除最常访问 发布:2025-01-23 12:42:29 浏览:527
女人资产如何配置 发布:2025-01-23 12:39:22 浏览:27
sql判断字符 发布:2025-01-23 12:37:44 浏览:531
sql存储过程返回值 发布:2025-01-23 12:32:31 浏览:274
陌陌怎么改密码 发布:2025-01-23 12:24:41 浏览:751
linux文件大小查看 发布:2025-01-23 12:19:35 浏览:974
三星s4文件加密 发布:2025-01-23 12:18:55 浏览:373
备份密码解锁在哪里点 发布:2025-01-23 12:14:27 浏览:857