Android studio如何通过jni调用openssl生成的.so动态链接库
(1)老版本,方法如下:
task copyNativeLibs(type: Copy) {
from(new File(project(':MyProject').buildDir, 'native-libs')) { include '**/*.so' }
into new File(buildDir, 'native-libs')
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
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
ative-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'])
}
AndroidStudio怎么调用so动态链接库?在我们日常开发中,经常会用到一些复杂的加密的算法以保证通信的安全。通常这些算法会用C或C++实现后打包成.so动态链接库并向Java层开发接口方便调用。
以AndroidStudio为例
1 . 首先去下载NDK包,下载路径如下可根据自己系统定点下载
https://developer.android.google.cn/ndk/downloads/index.html
2 . 创建一个安卓工程,初始化完成以后,右键项目->Open Module Settings
选择你下载的ndk存放路径
3 .创建一个jniTest类,写好navite方法,点击Build->Make Project打包文件
4 . 点击底下的Terminal窗口 cd 到当前项目目录例:当前目录为JniDemo C:\Users\bilibili\Desktop\JniDemo>cd C:\Users\bilibili\Desktop\JniDemo\app\build\intermediates\classes\debug
调用命令javah -jni 包名.类名生成头文件(文件生成在以上cd定位到的目录)
5 .在main>src下创建文件夹jni(new-Folder-jni Folder)进目录app>build>intermediates>classes>debug旗下找到头文件复制到jni文件夹
6 . jni目录下生c文件与.h文件重名c文件编写如下:
JNIEXPORT jstring JNICALL Java_com_jni_jnidemo_JniText_get_11111CLang_11String(JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!"); }7 . 在app的build.gradle的defaultConfig标签下添加如下标签:
ndk{ moduleName "jnitext" //生成的so名字,根据你自己的so定义 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。 }8 . 在工程的gradle.properties添加如下代码:
android.useDeprecatedNdk=true
9 . 点击Build->Make Project打包文件,去\app\build
dk\debug\lib\目录下拷贝编译好的so文件复制到app\libs目录下即可
10 .调用如下:
static { System.loadLibrary("jnitext");}public native String get_1111CLang_1String();
task copyNativeLibs(type: Copy) {
from(new File(project(':MyProject').buildDir, 'native-libs')) { include '**/*.so' }
into new File(buildDir, 'native-libs')
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
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'])
}
路爽泽通: 提示的错误,说是这个路径有非法的字符,你看看你的输入法是否英文,删除多余的空格再试试看.很多时候有中文或者特殊字符是不能创建的.
康定县13185861463: 如何更新Android Studio 3.0金丝雀版 - ?
路爽泽通: 方法一:进入AndroidDeveloper下载最新版方法二:在AndroidStudio中,Help->Checkforupdates
康定县13185861463: android studio怎么装svn插件 - ?
路爽泽通: android studio不需要自己去安装svn版本管理插件,下载安装android studio就已经集成后了,点击菜单vcs,下拉就可以看到svn的菜单,点击设置需要访问的本地服务器,有几个快捷图标,直接上传或者更新,非常方便.
康定县13185861463: 家乐福价格欺诈事件是怎么一回事!详细点 - ?
路爽泽通: 家乐福价格欺诈事件就是家乐福超市玩价签戏法,价签上标着低价,结账时却收高价,比如一个茶壶标价35,但是付钱时却刷的是66;还有明明是打折,促销价却和原价相同,比如一个...
康定县13185861463: 怎样将android studio怎通过样webservice访问sqlserve - ?
路爽泽通: 我刚刚弄通了 和你分享一下经验 android4.0以上别再主程序里面写连接webservice:public void getWeather(String city){ Runnable run = new Runnable() { @Override public void run() { WebServiceUtil webserviceutil = new WebServiceUtil(); ...
康定县13185861463: Android Studio怎么用gradle把github的一个开源库添加进来 - ?
路爽泽通: 只能把library项目clone下来添加到自己的项目中.然后在gradle中添加 dependencies { compile fileTree(dir: 'libs', include: '*.jar') compile 'com.github.chrisbanes.actionbarpulltorefresh:extra-abc:+' }
康定县13185861463: 回迁房应该怎么办理产权证 ?
路爽泽通: 回迁房办理房产证应交那些费用和手续:一、必须提交的证件:1、房屋拆迁安置协议书2、旧房拆迁作价凭证3、原房屋所有权证;二、应交纳费用:1、拆迁房与安置房等值部分,只交纳交易手续费,收费标准3元平方米,由个人交纳.2、超值部分,按买卖交纳契税和交易手续费,契税:2,手续费3元平方米3、产权登记费,2000年5月1日按80元套收取.
康定县13185861463: 解除合同的时效如何认定 ?
路爽泽通: 自通知到达对方时解除.根据《合同法》第九十六条,当事人一方依照本法第九十三条第二款、第九十四条的规定主张解除合同的,应当通知对方.合同自通知到达对方时解除.对方有异议的,可以请求人民法院或者仲裁机构确认解除合同的效力.法律、行政法规规定解除合同应当办理批准、登记等手续的,依照其规定.因此,解除合同的时效:自通知到达对方时解除.
康定县13185861463: 不买车位物业不让进小区应该如何处理 ?
路爽泽通: 小区公共停车位土地所有权归全体业主所有,物业管理处只享有管理权,而且这种管理权是业主委员会所赋予的.物业对业主的车辆限制进入是没有法律依据的,也是不合情理的.1.停车费可交业主委员会后统一交给物业管理企业也可以直接交给物业管理企业.2.缴费后物业无停车位而让业主停在与小区无相关联系的停车场是不合法的,既然是停在小区外的停车场则应该由该停车场收费,而不是物业管理企业,当然如果物业管理企业能提供与合同书相同的看守质量的话则可协商.
康定县13185861463: 14场胜负 - 谁知道胜负彩14场如何计算二等奖吗?假如只中13场,而且是复式, ?
路爽泽通: 中十四多少个复选就是多少个二等,如128的单,6个双选就是6个二等,中十三,错的那场多少个复选就多少个二等,单选就只一个二等,