導航:首頁 > 編程語言 > java自定義庫

java自定義庫

發布時間:2024-04-23 06:09:30

android打包時怎麼修改添加自定義java類和so庫,以及Androi

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

② java的自定義包

在Java中,包主要有以下用途 :
-包允許將類組合成較小的單元
-有助於避免命名沖突
-包允許在更廣的范圍內保護類、數據和方法
包可以是類、介面和子包的集合

創建包
package mypackage;
必須是.java文件中的第一句話
訪問 Java 包成員
mypackage.My_Class
導入包
import package_name.*;
導入子包
import package_name.package_sub.*;
編譯
javac –d <目錄名> xx.java
運行
java 包名.類名

如何使用自定義的包:
自己定義一個.java文件,創建一個包
例如:該文件是Test.java文件,創建的包是com.accp
那麼,編譯該文件後生成的Test.class的包路徑是
com.accp.Test.class
將該文件加入classpath中
a.如果將.class文件導入classpath中,那麼應該在classpath導入包含該.class文件所在最上級包的目錄
例如:Test.class文件最上級包目錄是com文件夾,com文件夾在c:\,所以應該加入c:\
b.如果將.jar文件加入classpath中,就應該在classpath中導入該.jar文件的詳細路徑

③ Java導入自定義包問題

正常情況下么,javac在編譯源文件的時候遇到非lang(java的核心類,不需要import的)類的話會嘗試看看有沒有被import進來了,如果被import進來了,那麼就使用import進來的類來替代遇到的非lang類。如果沒有被import進來或者import進來的類文件沒有被找到,那麼javac會在當前文件夾下面尋找對應於該類的源代碼文件,找到該文件後編譯它然後再編譯你指定的文件。如果在當前文件夾下面沒有找到的話,呵呵,那就會再到import指定的package目錄中尋找,找到了就編譯之,還是找不到的話就只有去classpath找了,如果找到了就也是編譯之。如果還沒有找到的話就報NoClassDefFoundError異常。

在這里,你使用了Date這一自定義的類,顯然不是lang類了,所以會先在當前文件夾下面找,如果你的Date.java或者Date.class被找到了,那麼就會檢查找到的文件,是date.java的話就編譯之,顯然,你把Date.java放在了當前目錄下而不是 firstpackage 中,所以嘗試編譯這個Date.java文件的時候會報錯說date.java沒有放在firstpackage文件夾中。當你把這個Date.java文件放到firstpackage的時候,就算你刪掉了Date.class也不會有錯誤的,因為找到了Date.java,javac會自動把它編譯一次的。

而你在第一次的時候直接import firstpackage.Date的話,那麼javac會到當前目錄下面的firstpackage文件夾下面找Date,找到了就萬事大吉啦,找不到么,那就還是按上面說的到當前文件夾下面找Date類或者源文件了。如果這時你把firstpackage文件夾下面的Date.class刪了,同時確保裡面沒有Date.java文件,那麼javac回到當前目錄下找Date.java文件,如果這個時候你把這個文件放在下面,那麼會出現和 上面你把 Date.java 放在當前目錄下而把Date.class 放在firstpackage文件夾下這種情況 同樣的錯誤。因為錯誤類型同樣是找到的date.java不在firstpackage文件夾下。

說了尼么多,雖然有點亂,但是應該沒錯才對。收工,閃~~

閱讀全文

與java自定義庫相關的資料

熱點內容
程序員一天編程多少個小時 瀏覽:62
java與模式下載 瀏覽:649
javaintlong區別 瀏覽:688
刀塔2如何選擇中國伺服器 瀏覽:810
英文劇,7個孩子 瀏覽:245
哈利波特電影名英文名 瀏覽:50
可以看污的軟體下載 瀏覽:18
好看網站推薦 瀏覽:860
iphone文件夾設封面 瀏覽:249
日本電影盔甲僵屍 瀏覽:614
手機怎麼創建minecraft伺服器 瀏覽:488
LCD在python中 瀏覽:980
小電影的網站誰知道 瀏覽:67
香港男女出軌開房遇見的電影名字 瀏覽:373
單片機stm使用說明書 瀏覽:641
手機百度android開發 瀏覽:957
男主懷孕生子女尊 瀏覽:297
邵氏3級電影 瀏覽:321
男主角叫安迪的電影 瀏覽:78