『壹』 在MACOX上的androidSTUDIO如何編譯OPENSSL原生的C庫成動態的.SO庫
目前暫不支持開發工具編譯C、c++代碼生成so文件,應該後續版本會有的。
.so 為共享庫,是shared object,用於動態連接的,和dll差不多,可以這樣調用so文件:
調用 System.out.println(System.getProperty("java.library.path"));
得到/usr/java/jdk1.5.0_13/jre/lib/i386,將SO文件放在該目錄下
運行java程序,輸出了由C語言函數計算出的結果
『貳』 在 Android Studio 中使用 ollvm 版本的 clang 編譯 so
如果簡單的使用 ollvm 版本的 clang.exe 等可執行文件替換掉原版 ndk toolchain 中的 exe,那麼將會報一些頭文件查找不到的錯誤,網上說的原因似乎是不同版本的 clang 將會使用的頭文件有差異,然而如果在控制台中直接使用 ollvm 版本 clang 去手動執行編譯命令,是可以正常編譯成功得到 .o 文件的,以下是我避免該坑的方法:
打開 "YOUT_PROJECT_PATH\app.externalNativeBuild\cmake\debug\TARGET_ABI\rules.ninja",找到 "rule C_COMPILER__TARGET" 這一行(TARGET 指你在 CMakeLists.txt 中使用 add_library 指定的庫名),然後你會在下面幾行找到編譯使用的 clang 路徑,把它替換為你 ollvm 版本 clang 的路徑,然後正常編譯即可得到你想要的 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一下,整個世界都明亮了
『肆』 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如何配置NDK/JNIAndroidStudio怎麼調用so動態鏈接庫
AndroidStudio怎麼調用so動態鏈接庫?在我們日常開發中,經常會用到一些復雜的加密的演算法以保證通信的安全。通常這些演算法會用C或C++實現後打包成.so動態鏈接庫並向Java層開發介面方便調用。
以AndroidStudio為例
1 . 首先去下載NDK包,下載路徑如下可根據自己系統定點下載
https://developer.android.google.cn/ndk/downloads/index.html
static{
System.loadLibrary("jnitext");
}
publicnativeStringget_1111CLang_1String();
『陸』 android studio 怎麼打開so文件
先在Android studio導入一個項目,然後進入到項目中,依次進入到app>>src>>main下。
在main的文件下進行創建一個jnilibs,然後選中main的文件,進行右鍵,彈出框中點擊「new」,移動下一級菜單中選擇「directory」。
對創建的文件夾進行昵稱,在昵稱中進行輸入「jnilibs」,然後點擊「ok」。
這樣在main的文件中創建一個為jnilibs的文件夾。
然後在jinlibs中文件進行添加so的文件,進入到so文件存放的文件中,直接把so的文件拖動到jinlibs的文件中。
拖動完成之後,會提示一個確認款提示信息,直接點擊「ok」即可。
在non-project file access中第一個希望編輯文件,第二個為咱想在當前會話中編輯任何非項目文件,根據的自己需要進行選擇,可以默認即可,點擊ok。
這樣就把so文件添加到jnilibs的文件中,這樣的話程序的代碼就可以進行調用其中方法。