⑴ Android怎麼調用第三方SO動態鏈接庫
已了解解決方案: 1.將SO文件直接放到libs/armeabi下,然後代碼中System.loadLibrary("xxx");再publicnativestaticintxxx_xxx_xxx();接下來就可以直接調用xxx_xxx_xxx()方法; 2.第二種方案,創建自己的SO文件,在自己的SO文件里調用第三方SO,再在程序中調用自己的SO,這種比較復雜,需要建java類文件,生成.h文件,編寫C源文件include之前生成的.h文件並實現相應方法,最後用androidNDK開發包中的ndk-build腳本生成對應的.so共享庫;求解: 網上說的第二種方案,是自己引用so庫,最後聲稱JAR ------解決方案-------------------------------------------------------- 首先要看這個SO是不是JNI規范的SO,比如有沒有返回JNI不直接支持的類型。也就是說這個SO是不是可以直接當作JNI來調用。如果答案是否定的,你只能選第二個方案。 如果答案是肯定的,還要看你是不是希望這個SO的庫直接暴露給JAVA層,如果答案是否定的,你只能選第二個方案,比如你本身也是一個庫的提供者。 一般如果你只有SO,就說明這個是別人提供給你的,你可以要求對方給你提供配套的JAVA調用文件。 1、這個要看這個SO是不是符合JNI調用的規范。還要看你自己的意願。 2、因為第二種方法最靈活,各種情況都可以實現。3、可以------解決方案-------------------------------------------------------- 看能不能直接從JAVA調用的最簡單的方法就是看SO里的函數名是不是Java_XXX_XXX_XXX格式的 是就可以,你可以自己寫一個配套的JAVA文件,注意一下SO函數名和JAVA函數名的轉換規則,或者向SO提供方索要; 不是的話就選第二種方案吧。
⑵ 怎麼動態調用第三方庫
說些我自己明白的:
動態載入:就是省略了把符號編譯到二進制的步驟,需要用函數的時候直接載入動態庫,然後從動態庫里找指定函數。
靜態編譯與動態編譯的區別
動態編譯的可執行文件需要附帶一個的動態鏈接庫,在執行時,需要調用其對應動態鏈接庫中的命令。所以其優點一方面是縮小了執行文件本身的體積,另一方面是加快了編譯速度,節省了系統資源。缺點一是哪怕是很簡單的程序,只用到了鏈接庫中的一兩條命令,也需要附帶一個相對龐大的鏈接庫;二是如果其他計算機上沒有安裝對應的運行庫,則用動態編譯的可執行文件就不能運行。 靜態編譯就是編譯器在編譯可執行文件的時候,將可執行文件需要調用的對應動態鏈接庫(.so)中的部分提取出來,鏈接到可執行文件中去,使可執行文件在運行的時候不依賴於動態鏈接庫。所以其優缺點與動態編譯的可執行文件正好互補。
⑶ android瀏覽器怎麼調用第三方的動態庫
需要NDK開發吧 可以調用第三方的 靜態庫 和 共享庫, 不過這些庫都要使用 NDK的交叉編譯環境 進行交叉編譯後才能在Android上調用;另外 Android 上是不能調用 x86 平台 編譯的第三方庫的
⑷ visual C++如何調用第三方庫(頭文件)
vc調用任何第三方庫的一般方法如下。
VC程序的生成過程一般經過編譯、鏈接、運行三個步驟,要調用第三方庫(包括OpenCV),必須處理好這三個步驟中的問題:
1) 頭文件的包含問題。頭文件即.h文件,它給出了函數(同時包含類、對象、宏等,以下通稱函數)的定義、調用方式等;必須指明頭文件的位置,只有這樣才能調用第三方庫中的函數。如果頭文件未處理好而調用相關的函數,則因語法錯誤編譯失敗,出現類似「某某未定義」的錯誤。
方法:#include<頭文件>,頭文件用絕對路徑或在項目設置里添加include目錄。
2) Lib文件的配置。Lib文件指明具體的機器代碼位置。Lib文件配置錯誤,程序可以通過語法檢查,但在鏈接時會出現「未處理的外部符號『某某』,該符號在某某位置處被引用」的錯誤。
方法:#prgma comment(lib,"xxx.lib"),用到的lib文件都要用這個命令添加上,或者在設置里鏈接上,具體怎麼做自己找吧。
3) DLL即動態鏈接庫的問題。DLL中存放了第三方庫中的機器代碼。DLL配置錯誤,程序可以正確編譯,但在運行時會出現「找不到動態鏈接庫『某某.dll』」而導致程序退出。
方法:把dll文件所在目錄添加到環境變數,或直接復制到系統目錄下,或著與生成的exe放在同一目錄下。注意:有的庫具備debug與release兩個版本,lib版本與dll版本一定要一致,否則程序會異常出錯。
⑸ 動態庫可以使用第三方庫嗎ios
iOS如果想要實現實時發版,據我了解現在基本上用的是兩種方式1:使用Lua腳本進行,基本上很多手游都是這樣做的,再配合上Cocos2d-x這個框架使用起來也比較簡單。2:使用動態庫這里我說的就是這中方式
⑹ 如何將第三方類庫編譯自己的動態庫文件中
隨著動態庫的流行,靜態庫越來越少了(關於動態庫和靜態庫的介紹請點擊),但是不排除項目中有些依賴的第三方還是使用的靜態庫。
那麼這種情況下就可以考慮,將第三方靜態庫做一個二次封裝。一來和業務代碼進行隔離,方便以後第三方庫的升級,二來將靜態庫封裝進動態庫里便於管理和利用動態庫的優勢。一般情況下,用動態庫封裝靜態庫很簡單,就是將靜態庫直接拖進動態庫的工程里,直接編譯即可。但是有一種情況下這么做是不行的,需要暴露靜態庫的頭文件,也就是雖然靜態庫放在動態庫裡面了,但是靜態庫的頭文件還要提供給上層應用調用。
⑺ 小米手機如何設置第三方動態壁紙
使用「星空視頻壁紙」app,即可將視頻設置為動態壁紙,除了軟體自帶的壁紙庫,還可以將用戶自己下載的視頻設置為動態壁紙。使用時需要將「星空壁紙引擎」加入清理白名單,一旦軟體被關閉,壁紙就恢復成之前的靜態壁紙了。
⑻ ndk-Android NDk 怎麼編譯時動態鏈接第三方so庫,有頭文件
問題描述:Android如何調用第三方SO庫;
已知條件:SO庫為Android版本連接庫(*.so文件),並提供了詳細的介面說明;
已了解解決方案:
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共享庫;
求解:
1.上面兩種方案是否可行?不可行的話存在什麼問題?
2.兩種方案有什麼區別?為什麼網上大部都是用的第二種方案?
3.只有一個*.so文件,並提供了詳細的介面說明,是否可在ANDROID中使用它?
首先要看這個SO是不是JNI規范的SO,比如有沒有返回JNI不直接支持的類型。也就是說這個SO是不是可以直接當作JNI來調用。如果答案是否定的,你只能選第二個方案。
如果答案是肯定的,還要看你是不是希望這個SO的庫直接暴露給JAVA層,如果答案是否定的,你只能選第二個方案,比如你本身也是一個庫的提供者。
一般如果你只有SO,就說明這個是別人提供給你的,你可以要求對方給你提供配套的JAVA調用文件。
1、這個要看這個SO是不是符合JNI調用的規范。還要看你自己的意願。
2、因為第二種方法最靈活,各種情況都可以實現。
3、可以
看能不能直接從JAVA調用的最簡單的方法就是看SO里的函數名是不是Java_XXX_XXX_XXX格式的
是就可以,你可以自己寫一個配套的JAVA文件,注意一下SO函數名和JAVA函數名的轉換規則,或者向SO提供方索要;
不是的話就選第二種方案吧。
1、檢查所需文件是否齊全
使用第三方動態庫,應該至少有2個文件,一個是動態庫(.so),另一個是包含
動態庫API聲明的頭文件(.h)
2、封裝原動態庫
原動態庫文件不包含jni介面需要的信息,所以我們需要對其進行封裝,所以我
們的需求是:將libadd.so 裡面的API封裝成帶jni介面的動態
3、編寫庫的封裝函數libaddjni.c
根據前面生成的com_android_libjni_LibJavaHeader.h 文件,編寫libaddjni.c,用
來生成libaddjni.so
Android中集成第三方軟體包(.jar, .so)
Android中可能會用到第三方的軟體包,這包括Java包.jar和Native包.so。jar包既可通過Eclipse開發環境集成,也可通過編譯源碼集成,看你的工作環境。
假定自己開發的程序為MyMaps,需要用到BaiMaps的庫,包括mapapi.jar和libBMapApiEngine_v1_3_1.so。
一、Eclipse中集成第三方jar包及.so動態庫
MyMaps工程下創建目錄libs以及libs/armeabi,把mapapi.jar放在的libs/目錄下,把libBMapApiEngine_v1_3_1.so放在libs/armeabi/下。
Eclipse中把第三方jar包mapapi.jar打包到MyMaps的步驟:
1. 右擊工程,選擇Properties;
2. Java Build Path,選擇Libraries;
3. Libraries頁面點擊右面按鈕「Add Library…」;
4. 選擇「User Library」,點擊「Next」;
5. 點擊「User Libraries」按鈕;
6. 在彈出界面中,點擊「New…」;
7. 輸入「User library name」,點擊「OK」確認;
8. 返回之後,選擇剛剛創建的User library,右面點擊「AddJARs」;
9. 選擇MyMaps/libs/下的mapapi.jar;
10. 確認,返回。
這樣,編譯之後,該jar包就會被打進MyMaps.apk中,libBMapApiEngine_v1_3_1.so也被打包在lib/armeabi/中。
程序運行過程中,libBMapApiEngine_v1_3_1.so被放在/data/data/<yourAppPackage>/lib/下,載入動態庫時系統會從程序的該lib/目錄下查找.so庫。
二、源碼中集成第三方集成jar包及.so動態庫
Android源碼中MyMaps放在packages/apps下。MyMaps下創建目錄libs以及libs/armeabi,並把mapapi.jar放在libs/,把libBMapApiEngine_v1_3_1.so放在libs/armeabi。
2.1 修改Android.mk文件
Android.mk文件如下:
[plain] view plain
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := libmapapi
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := MyMaps
include $(BUILD_PACKAGE)
##################################################
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libmapapi:libs/mapapi.jar
LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so
LOCAL_MODULE_TAGS := optional
include $(BUILD_MULTI_PREBUILT)
# Use the following include to make our testapk.
include $(callall-makefiles-under,$(LOCAL_PATH))
1 集成jar包
LOCAL_STATIC_JAVA_LIBRARIES取jar庫的別名,可以任意取值;
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES指定prebuiltjar庫的規則,格式:別名:jar文件路徑。注意:別名一定要與LOCAL_STATIC_JAVA_LIBRARIES里所取的別名一致,且不含.jar;jar文件路徑一定要是真實的存放第三方jar包的路徑。
編譯用BUILD_MULTI_PREBUILT。
2 集成.so動態庫
LOCAL_PREBUILT_LIBS指定prebuilt so的規則,格式:別名:so文件路徑。注意:別名一般不可改變,特別是第三方jar包使用.so庫的情況,且不含.so;so文件路徑一定要是真實的存放第三方so文件的路徑。
編譯拷貝用BUILD_MULTI_PREBUILT。
2.2 加入到GRANDFATHERED_USER_MODULES
在文件user_tags.mk中,把libBMapApiEngine_v1_3_1加入到GRANDFATHERED_USER_MODULES中
[plain] view plain
GRANDFATHERED_USER_MODULES += \
… \
libBMapApiEngine_v1_3_1
user_tags.mk可以是build/core下的,也可以是$(TARGET_DEVICE_DIR)下的,推薦修改$(TARGET_DEVICE_DIR)下的。
2.3 編譯結果
MyMaps.apk編譯生成在out/target/proct/<YourProct>/system/app/下;
libBMapApiEngine_v1_3_1.so放在out/target/proct/<YourProct>/system/lib/下,這也是系統載入動態庫時搜索的路徑。
⑼ C++動態載入第三方庫
Windows下的話用LoadLibrary函數載入dll,GetProcAddress獲取函數,FreeLibrary釋放。SDK沒有namespace的么……
⑽ 如何動態調試Python的第三方庫
用sklearn中的sklearn.feature_extraction.text.TfidfTransformer來獲取TF特徵,但發現sklearn的計算結果與我手工計算結果不一樣。 雖然能在github上找到sklearn的源碼。但不能動態調試,就無法直觀的看到結果。