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文件中的內容。