導航:首頁 > 源碼編譯 > 第三方庫編譯到自己的程序中

第三方庫編譯到自己的程序中

發布時間:2022-06-24 12:31:29

❶ 如何將android的第三方jar包編譯進入apk中

在你的android工程下面建一個libs文件夾,然後把第三方jar包拷貝進去。
右鍵點擊libs文件夾,選擇Build Path —— Use as Source Folder
再運行試試。

❷ 如何將第三方類庫編譯自己的動態庫文件中

隨著動態庫的流行,靜態庫越來越少了(關於動態庫和靜態庫的介紹請點擊),但是不排除項目中有些依賴的第三方還是使用的靜態庫。

那麼這種情況下就可以考慮,將第三方靜態庫做一個二次封裝。一來和業務代碼進行隔離,方便以後第三方庫的升級,二來將靜態庫封裝進動態庫里便於管理和利用動態庫的優勢。一般情況下,用動態庫封裝靜態庫很簡單,就是將靜態庫直接拖進動態庫的工程里,直接編譯即可。但是有一種情況下這么做是不行的,需要暴露靜態庫的頭文件,也就是雖然靜態庫放在動態庫裡面了,但是靜態庫的頭文件還要提供給上層應用調用。

❸ 安卓工程怎麼利用第三方庫,就是自己用C++編寫的編碼解碼程序,對圖片進行編碼解碼

你可以嘗試將構造函數和析構函數一起導出,並且,將編譯DLL文件時生成的LIB文件添加到調用DLL的項目中.
如果還不行,請將定義DLL的頭文件貼出來分析.
------------------------------------------------------------------
補充:
MFC擴展DLL只能由MFC的應用程序調用,請問你調用DLL的程序是什麼類型?

❹ vs 封裝靜態庫怎樣把第三方庫編譯進去

在企業開發中,一些核心技術或者常用框架,出於安全性和穩定性的考慮,不想被外界知道,所以會把核心代碼打包成靜態庫,只暴露頭文件給程序員使用(比如:友盟、網路地圖等第三方的sdk) 靜態庫和動態庫的存在形式 靜態庫:.a 和 .framework 動...

❺ 如何在Makefile.am中引入第三方so庫

如果只有so,沒有a文件和h頭文件,那麼你需要知道so開放出來的函數。 比如so提供的函數有open 。close。那麼:
1 在你的源程序中需要先使用dlopen函數打開這個so庫。
2 在源程序中使用dlsym函數拿到開放出來的函數(open close)。拿到函數指針後,就可以調用so裡面的函數了。
dlopen dlsym是linux的庫函數。
你是通過源代碼編譯過來的,你可以把所有源碼生成靜態庫文件(非so動態庫),然後使用庫的頭文件和你的程序進行編譯,編譯完後連接靜態庫文件就可以運行了。

❻ 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/下,這也是系統載入動態庫時搜索的路徑。

❼ 開發中怎樣才能把第三方的塊載入到自己的項目中來呢

你好,很高興為你解答。可以用於 require 控制載入模塊的表,引用到自己的項目中。
1.這張表內的每一項都是一個 查找器函數。 當查找一個模塊時, require 按次序調用這些查找器, 並傳入模塊名(require 的參數)作為唯一的一個參數。 此函數可以返回另一個函數(模塊的 載入器)加上另一個將傳遞給這個載入器的參數。 或是返回一個描述為何沒有找到這個模塊的字元串 (或是返回 nil 什麼也不想說)。
Lua 用四個查找器函數初始化這張表。
第一個查找器就是簡單的在 package.preload 表中查找載入器。
第二個查找器用於查找 Lua 庫的載入庫。 它使用儲存在 package.path 中的路徑來做查找工作。 查找過程和函數 package.searchpath 描述的一致。
第三個查找器用於查找 C 庫的載入庫。 它使用儲存在 package.cpath 中的路徑來做查找工作。 同樣, 查找過程和函數 package.searchpath 描述的一致。 例如,如果 C 路徑是這樣一個
2.查找器查找模塊 foo 會依次嘗試打開文件 ./foo.so,./foo.dll, 以及 /usr/local/foo/init.so。 一旦它找到一個 C 庫, 查找器首先使用動態鏈接機制連接該庫。 然後嘗試在該庫中找到可以用作載入器的 C 函數。 這個 C 函數的名字是 "luaopen_" 緊接模塊名的字元串, 其中字元串中所有的下劃線都會被替換成點。 此外,如果模塊名中有橫線, 橫線後面的部分(包括橫線)都被去掉。 例如,如果模塊名為 a.b.c-v2.1, 函數名就是 luaopen_a_b_c。
3.第四個搜索器是一體化載入器。 它從 C 路徑中查找指定模塊的根名字。 例如,當請求 a.b.c時, 它將查找 a 這個 C 庫。 如果找得到,它會在裡面找子模塊的載入函數。 在我們的例子中,就是找luaopen_a_b_c。 利用這個機制,可以把若干 C 子模塊打包進單個庫。 每個子模塊都可以有原本的載入函數名。
除了第一個(預載入)搜索器外,每個搜索器都會返回 它找到的模塊的文件名。 這和 package.searchpath 的返回值一樣。 第一個搜索器沒有返回
在指定 path 中搜索指定的 name 。
4.路徑是一個包含有一系列以分號分割的 模板 構成的字元串。 對於每個模板,都會用 name 替換其中的每個問號(如果有的話)。 且將其中的 sep (默認是點)替換為 rep (默認是系統的目錄分割符)。 然後嘗試打開這個文件名。
例如,如果路徑是字元串
返回第一個可以用讀模式打開(並馬上關閉該文件)的文件的名字。 如果不存在這樣的文件,返回 nil 加上錯誤消息。 (這條錯誤消息列出了所有嘗試打開的文件名。)
載入一個模塊。 這個函數首先查找 package.loaded 表, 檢測 modname 是否被載入過。 如果被載入過,require 返回 package.loaded[modname] 中保存的值。 否則,它試著為模塊尋找 載入器 。

❽ 如何將第三方靜態庫編譯到自己的靜態庫中

我記得有個選項能包進去的,好像是/ASSEMBLYMODULE

❾ C++怎樣把第三方庫隱藏在實現下面

編譯時包含第三方庫的頭文件,如果第三方庫包含lib文件,則在鏈接時將第三方庫鏈接到你自己的程序裡面即可。

❿ linux下將程序中用到的第三方庫編譯到自己的程序中

舉例,頭文件名 abc.h 函數名為 abc_test(); 第三方庫頭文件目錄為/abc/include/ 鏈接庫目錄為/abc/lib/ 1、頭文件和源文件:這是最好的情況,引用頭文件和相關函數即可。 如:#include "abc.h" abc_test();//直接調用即可 編譯時,Makefile中加入編譯選項 -I/abc/include 為了能將庫的頭文件引進來。 而且你的程序運行時,不再需要這個第三方庫。 2、靜態鏈接庫:引用頭文件和相關函數,設提供的靜態庫名為 libabc.lib 編譯時,Makefile中加入 編譯選項 1)-I/abc/include #編譯時加,為了能將庫的頭文件引進來; 2)-L/abc/lib -labc #鏈接時加的 而且你的程序運行時,不再需要這個第三方庫。 3、動態鏈接庫,設動態鏈接庫為libabc.so 調用動態鏈接庫文件,需要dlopen等函數 編譯時,Makefile中加入 編譯選項 1)-I/abc/include #編譯時加,為了能將庫的頭文件引進來; 2)-L/abc/lib -labc #鏈接時加的 注意:你的程序運行時,需要這個第三方庫的libabc.so文件。

閱讀全文

與第三方庫編譯到自己的程序中相關的資料

熱點內容
華為主題軟體app怎麼下 瀏覽:837
我們的圖片能夠收藏加密嗎 瀏覽:978
mysql空值命令 瀏覽:213
python整點秒殺 瀏覽:882
怎麼樣互傳app 瀏覽:292
python分布式抓包 瀏覽:36
輕量級php論壇 瀏覽:342
如何查看應用存儲在哪個文件夾 瀏覽:436
app開發項目范圍怎麼寫 瀏覽:76
androidjms 瀏覽:843
彈珠連貫解壓 瀏覽:243
程序員的網課 瀏覽:904
廣東加密狗防拷貝公司 瀏覽:450
rtf轉換pdf 瀏覽:350
單片機退出中斷 瀏覽:141
可以對單個內容加密的便簽 瀏覽:825
1024程序員節小米 瀏覽:316
共享和ftp伺服器有什麼區別 瀏覽:716
centos7卸載php 瀏覽:184
解壓黏黏球如何玩 瀏覽:230