androidsojar
‘壹’ android jni 使用第三方提供的.so库及所对应的jar包
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共享库。 http://www.ijiami.cn/newsInfo?id=293&v=3
2. DEX加壳保护,DEX指令动态加载保护和高级源码混淆保护。其中DEX加壳保护是“爱加密”主推的卖点,该技术通过将DEX文件隐藏,并生成一个类似于虚像的壳文件,阻止黑客利用反编译工具获取App源码。另外,爱加密http://www.ijiami.cn/推出了so库保护,使得C/C++ 层面的代码安全也得到防护。加上资源文件保护(图片、音频等文件的防查看和防修改)、xml 主配文件保护(对主配文件进行二次签名)、内存保护等措施,可以基本保证App的动态和静态安全。
‘贰’ android 怎么把多个so文件编译成jar
一共分为2步:
1.在Java中编写要调用的静态方法和需要加载的库,并生成头文件。
2.配置gradle
3.配置Android.mk文件和application.mk文件
下面一步步的走:
首先需要在Java类中声明要调用的方法,以及要加载的库,我们在包下新建一个jniUtil类,如下所示
[plain]view plain
publicclassjniUtil{
//要加载的库,生成的库格式为:lib+库名.so
static{System.loadLibrary("hello-jni");}
//要调用的本地方法,在c文件中该方法名称格式为:java_包名_类名_方法名
();
}
注意:在编译时该类中不能有汉字,包括注释,否则会出现编码GBK的不可映射字符错误。
接下来就是利用external Tools生成头文件.h,这里可参考点击打开链接
然后就会在main目录下生成Jni文件夹,并且包含.h文件。下面就是编写C文件,或者可以拷贝已经写好的C文件放置在该jni文件夹中.
2.配置gradle
我们这里不用gradle 去编译,而是只让他去加载已经生成的so库,改用android.mk 去编译(稍后配置android.mk)
在app的build.gradle 下的android 标签下添加:
[plain]view plain
sourceSets{
main{
jni.srcDirs=[]//禁止gradle自动编译,使用已经编译好的So库
jniLibs.srcDirs=['src/main/jniLibs','libs']//指向要使用的库文件//的路径,前边的是自己项目的,后边的是第三方的so
}
}
从上面可以看出,我们生成的库是放在
src/main/jniLibs
目录下面的,那么这个是如何配置呢?还是在该gradle下面配置ndk的编译脚本,注意放在android标签外面:
[plain]view plain
tasks.withType(JavaCompile){
compileTask->compileTask.dependsOnCopyToJniLibs
}
taskndkBuild(type:Exec,description:'CompileJNIsourceviaNDK'){
Propertiesproperties=newProperties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
defndkDir=properties.getProperty('ndk.dir')
commandLine"$ndkDir/ndk-build.cmd","NDK_PROJECT_PATH=$projectDir.absolutePath\build","APP_BUILD_SCRIPT=$projectDir.absolutePath\src\main\jni\Android.mk","NDK_APPLICATION_MK=$projectDir.absolutePath\src\main\jni\Application.mk"
//你自己的mk文件目录
}
在ndkbuild完成后把生成的so文件复制到jniLibs,这里和上面配置的加载so文件路径要一致哦
[plain]view plain
taskCopyToJniLibs(type:Copy,dependsOn:'ndkBuild',description:'thenativelibstojniLibs'){
fromfileTree(dir:file(buildDir.absolutePath+'/libs'),include:'**/*.so')
intofile('src/main/jniLibs')
}
新建Android.mk和application.mk,这里我把Android.mk和application.mk放在jni文件夹下了,具体可以自己修改。默认生成的SO文件会在build下面的libs中,我们拷贝出来放到src/main/jniLibs下面。
3.配置Android.mk和Application.mk
‘叁’ androidstudio怎么将写好的so文件工程打包成jar包
Android Studio的so库导入和Eclipse的方式有些不同。在Android Studio中,要在工程的src/main下面新建一个jniLibs文件夹,然后将所用到的第三方so库复制进来,然后找到Project下的build.gradle文件,在其中添加以下几行代码:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
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"
}
然后重新Gradle一下代码,第三方so库就加了进来。
参考http://www.cnblogs.com/devpan/p/5536238.html
‘肆’ AndroidStudio如何导入jar,so,以及第三方的开源库
一般用eclipse生成的项目,导入androidstudio都会有各种问题,不过要解决也不难,简单几步设置就可以了,说几个比较常用的步骤:
1、导入主项目之后,需要在File/projectstrucure的moles选项设置好各种路径,比如src、libs、gen、bin的路径等等;
2、在eclipse里的project,在as上就变成mole了,所以要用importmole的方式引入库项目,之后可能也要重复步骤1给库项目设置好路径;
3、jar文件还是放在libs文件夹,然后需要在projectstrucure里的libraries选项引入进来;
4.库项目和各种jar都导进来了,但是主项目还是报错,这可能是因为主项目和这些库文件的依赖关系没关联好,还是projectstrucure的主项目里面,选择dependencis,把需要用到的mole和library都添加进来;
所以关键还是在对projectstrucure的设置。
‘伍’ 如何在 android studio中添加引用 jar文件和so文件
android studio 中 添加.so 文件:
在src/main中添加 jniLibs文件夹 ,把.so复制进去
在build.gradle中就添加这么几行 ,
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
3.然后make project
4.切换到android结构下,你会看到 jniLibs 中.so已经变成了.jar文件,证明已经成功
‘陆’ android studio 怎么将so打包成jar
主要思想: 1:将所有的so文件打包进一个jar文件; 2:将这个jar文件作为依赖文件; 我不会写Goovy的代码,下面这些都是我从上面那些参考页面抄的,大概意思能看懂,如果有问题,请指正 代码 task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') { destinationDir file("$buildDir/native-libs") baseName 'native-libs' extension 'jar' from(new File(project(':MyProject').getProjectDir(), 'libs')) { include '**/*.so' } into 'lib/' from(new File(project(':library').getProjectDir(), 'libs')) { include '**/*.so' } into 'lib/' } tasks.withType(Compile) { compileTask -> compileTask.dependsOn(nativeLibsToJar) }
‘柒’ 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文件中的内容。