android在載入庫
Ⅰ android studio 怎麼載入庫
首先 在你把需要的文件復制到項目libs文件夾下(如果沒有這個文件夾,自己建一個);
然後再build.gradle的dependencies 里添加依賴;
文件不同添加依賴方式不同,如是arr文件
compile(name: 'XMF-2.0.3-release', ext: 'aar')
如果是jar包compile files('libs/passguard.jar')
當然也可以右鍵項目 選擇open mole setting-->dependencies-->選擇+號添加你的文件
如果還有什麼問題,聯系我
Ⅱ android項目中如何載入已有so庫
1,在項目根目錄下建立文件夾libs/armeabi文件夾 2,將so庫放入libs/armeabi文件夾注意事項: 1,如果採用靜態注冊的方式請注意C文件中嚴格按照命名規則java_packageName_className_method()的方式命名 2,在Android項目中建立同上述命名規則中packageName中相同的包名,在此包名下建立同上述命名規則中className相同的類名 3,在className聲明native方法 4,程序中載入so庫System.loadLibrary(data/data/xxx.xxx.xxx/lib/xx.so)或者System.loadLibrary(xx),例如:System.loadLibrary(data/data/com.dtBank.app.service/lib/libjnixcld.so);
Ⅲ android無法載入androidextra庫
Android項目直接在手機上可以運行。但是打包完後會報這個錯誤,通過錯誤信息大概可以看出是混淆文件的問題,然後就加上RX的混淆重新打包就可以運行了。
Ⅳ android項目中如何載入已有so庫
1,在項目根目錄下建立文件夾libs/armeabi文件夾
2,將so庫放入libs/armeabi文件夾注意事項:
1,如果採用靜態注冊的方式請注意C文件中嚴格按照命名規則Java_packageName_className_method()的方式命名
2,在Android項目中建立同上述命名規則中packageName中相同的包名,在此包名下建立同上述命名規則中className相同的類名
3,在className聲明native方法
4,程序中載入so庫System.loadLibrary(data/data/xxx.xxx.xxx/lib/xx.so)或者System.loadLibrary(xx),例如:System.loadLibrary(data/data/com.dtBank.app.service/lib/libjnixcld.so);
Ⅳ android中64為程序如何載入32位動態庫
defaultConfig {
......
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
這時會報錯,因為gradle的配置中,並不知道是否要做操作系統的兼容,這時只要在gradle.properties文件中加上
Android.useDeprecatedNdk=true
就可以了。
Ⅵ Android Native庫的載入及動態鏈接
我們從一個簡單的NDK Demo開始分析。
下面從 System.loadLibrary() 開始分析。
下面看 loadLibrary0()
參數 loader 為Android的應用類載入器,它是 PathClassLoader 類型的對象,繼承自 BaseDexClassLoader 對象,下面看 BaseDexClassLoader 的 findLibrary() 方法。
下面看 DexPathList 的 findLibrary() 方法
回到 loadLibrary0() ,有了動態庫的全路徑名就可以裝載庫了,下面看 doLoad() 。
nativeLoad() 最終調用 LoadNativeLibrary() ,下面直接分析 LoadNativeLibrary() 。
對於JNI注冊,這里暫不討論,下面看 OpenNativeLibrary() 的實現。
下面看 android_dlopen_ext() 的實現
接下來就Android鏈接器linker的工作了。
下面從 do_dlopen() 開始分析。
find_library() 當參數translated_name不為空時,直接調用 find_libraries() ,這是裝載鏈接的關鍵函數,下面看它的實現。
find_libraries() 中動態庫的裝載可以分為兩部分
下面從 find_library_internal() 開始分析。
下面分析 load_library()
下面看另一個 load_library() 的實現
下面分析ELF文件頭以及段信息的讀取過程,也就是LoadTask的 read() ,它直接調用ElfReader的 Read() 方法。
動態庫的裝載在LoadTask的 load() 中實現。
下面看ElfReader的 Load() 方法
動態庫的裝載已經完成,下面看鏈接過程。
下面看 prelink_image()
鏈接主要完成符號重定位工作,下面從 link_image() 開始分析
下面以函數引用重定位為例分析 relocate() 方法
Ⅶ 如何在android使用自定義Adapter載入資料庫中的圖片(資料庫中存的是路徑,圖片從伺服器下載到sdcard中)
先在資料庫中獲取圖片的路徑,然後通過路徑來獲得圖片。用下面這個方法就能實現了。Bitmap bitMap = BitmapFactory.decodeFile(pathName);
Ⅷ 請教android對so庫的載入與調用
android4.x之後已經限制so不能從sdcard載入,但是可以從其他目錄載入.
so庫不是簡單的改一個字元串就行的.
如果載入成功,調用出錯,那說明確實做了位置判斷,不過真的很少會有這樣的需求,一般常見的是會做包名判斷,自身完整性校驗
Ⅸ 安卓JVM載入so庫流程
好久沒有寫點東西發了,工作中的事情有點雜,也找不到整塊東西可以寫的。
最近調查了一個問題,稍微追了一下流程,這里記錄一下。
由於我們支持的設備相對比競品,zygote進程多佔用了好幾倍的內存空間。通過mp meminfo後發現,我們的設備在so庫,ttf,和unkonwn mmap的內存空間相比競品一共大了20多M,其中so庫多了15M左右。
通過查看zygote進程的smaps,確定了佔用空間最大的幾個so庫確實是我們自己的。雖然確定了內存佔用大的原因,還是得把這些so庫是載入在zygote進程中的時機確定了才行。
我的第一反應就是在zygote啟動時,載入sharedLibrary()時,把這些庫載入了,於是去看了這部分源碼,並沒有。
通過反復調試以及追蹤源碼,最後發現是在JVM啟動的過程中載入了這些so庫,這些so庫的配置在「system/etc/public.libraries.txt」下。
這個文件里配置的都是public的so庫,能夠被普通app訪問的。類似的配置文件還有「vendor/etc/」下面的,還有一些其他的配置地方,我沒有深入去看,想要看的盆友可以自己去看源碼或者注釋。
下面我就帶大家一起看看虛擬機載入這些so庫的流程。
調用棧:
frameworks/base/cmds/app_process/app_main.cpp
---->runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
frameworks/base/core/jni/AndroidRuntime.cpp
---->AndroidRuntime::startVm
--->JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs)
art/runtime/jni/java_vm_ext.cc
--->android::InitializeNativeLoader();
system/core/libnativeloader/native_loader.cpp
---->Initialize()
---->ReadConfig(public_native_libraries_system_config, &sonames, always_true, &error_msg)
其中,public_native_libraries_system_config 為 system/etc/public.libraries.txt
這部分流程是在安卓設備開機過程中的,在執行ZygoteInit.main()之前會先啟動java虛擬機的,這樣fork其他java進程的時候,java環境就已經有了,不用再創建虛擬機了。
最後貼一下Initialize()函數:
Ⅹ Android載入so庫時的問題
so庫有問題哈,直接導致段錯誤而崩潰
敢問是什麼so庫