安卓so庫win下怎麼調用
⑴ 請教一下,SO文件如何反編譯最好是WIN環境下搭建。謝謝。
謝謝。。。以前玩過CD版的,我去找找。。。另外SO庫和DLL庫的逆向近似嗎?貌似我查了下,我關注的這個軟體轉碼演算法網上還木有。。。是不是也有殼的說法,或者密鑰?但離線閱讀能實現的功能應該可以逆向,而且是不分文本、通用型轉碼。
⑵ 請問WINDOWS系統下,PHP如何調用.so文件
在linux機器上運行該so,參數和返回值 由wrapper程序 封裝 響應及傳遞 給windows機器上跑的 proxy程序. 這樣就實現了win調用so了. : )
⑶ 關於Android開發中java對於.so庫的調用
廠家並沒有欺騙你或者是含糊你的意思,確實是只提供給你jar包以及 so 庫就可以了,做法是這樣子的:
1.比如我現在在用net.sqlcipher.database 這個加密庫(網上能搜得到的,用於資料庫加密)。 那麼我現在就在項目用載入這個jar包(在你的項目單擊右鍵-》屬性-》Java Build Path-》Libraries-》Add Jars,選擇提供給你的jar包,我這里是 sqlcipher.jar,然後在Order and Export勾選你剛剛載入的 jar包。)
2.打開你的workspace目錄,在你的項目目錄下創建一個文件夾libs(如果文件夾不存在的話),然後將提供給你的so庫放入該目錄,基本架構就算是搭建好了。
3.進行開發,這里你需要問一下提供給你jar包的廠家,基本的用法,否則的話是無法進行開發的,因為你都不知道怎麼去用。 sqlcipher的基本用法是:
SQLiteDatabase.loadLibs(this); //載入 so庫文件,你的廠家的方法應該也是類似。
File databaseFile = getDatabasePath(SQLite_toll.DATABASE_NAME);
databaseFile.mkdirs();
databaseFile.delete();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, helper_SharedPreferences.get_str_sp("database_cipher",this), null);
SQLite_toll initToll = new SQLite_toll(this, avaSys);
initToll.onCreate(database);
database.close();
//因為我sqlcipher是用於資料庫加密的,所以你所看到的都是資料庫的一些方法,你廠家提供給你的jar包的用法,你是要去問他們的,或者他們的是否有開源代碼,又或者是網上也有很多人使用,那麼能搜到相關資料。
根據你補充的提問,那麼就是System.loadLibrary(this); ,就可以調用了
⑷ so後面有數字的動態庫怎麼鏈接,怎麼理解
版本有關,比如你上面說的libiconv.so.2,一般會建立一個libiconv.so的軟連接,用-liconv也是找的libiconv.so,這樣的好處是我可以有多個版本的iconv庫,比如還有一個libiconv.so.1,可以同時存在,但編譯和執行的時候使用的是libiconv.so軟連接指向的那個!這樣makefile也不需要根據庫版本進行變更
⑸ 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/下,這也是系統載入動態庫時搜索的路徑。
⑹ 手機的so是什麼文件格式怎麼打開
這是,共享鏈接庫文件,二進制的文件,用WinHex或者是記事本什麼的都可以,但是基本都是亂碼
⑺ 請教一下,SO文件如何反編譯最好是WIN環境下搭建。謝謝。
找到一些說法,繼續學習研究。。。[Android]由反編譯YY想到:如何防止apk被反編譯?看到YY出了Android版本,於是興高采烈的想看看YY裡面高音質房間的實現.不瞧不知道,一瞧,呃,YY的人真聰明.(有以前同事)無他,採取的方法不僅節約時間,而且保密,防止別人破解反編譯(尤其是我這種人,呵呵)1. YY居然採用jni的方法來保護自己的協議,聰明.估計大致想法是Android界面的東西隨便你們去抄,別破解我的協議就好,而且原有的C++代碼也可以用,直接編譯成so的方式給android用,高,實在是高.(apk裡面的libyyjni.so)這是第1種保護自己核心代碼的方法,這需要開發人員熟悉C++和java(jni)2. 之前想看看AutoNavi的實現,發現反編譯出來的都是代碼混淆之後的,也就是java代碼的一種保護方式這是第2種代碼層次的Java保護方法3. 前段時間想看一個Android的天氣代碼, 發現其實現部分都通過web service來實現, 這個App上沒有核心代碼這是第3種操作WebService化的保護方式4. 當然還有些沒有技術含量,沒有必要防止別人反編譯,呵呵(譬如包含一個WebView之類的,重點介紹我隔壁的安卓壁紙, www.androidesk.com, 基於網頁的App), 如果要做代碼保護,那真就是吃多了沒事做.這是第4種不保護的方式,哈哈
⑻ .so文件可以用記事本打開嗎.so文件linux
什麼是SO文件?
SO文件格式即ELF文件格式,它是Linux下可執行文件,共享庫文件和目標文件的統一格式。
根據看待ELF文件的不同方式,ELF文件可以分為鏈接視圖和裝載視圖。鏈接視圖是鏈接器從鏈接的角度看待靜態的ELF文件。
從鏈接視圖看ELF文件,ELF文件由多個section組成,不同的section擁有不同的名稱,許可權。而裝載視圖是操作系統從載入ELF文件到內存的角度看待動態的ELF文件。
從裝載視圖看ELF文件,ELF文件由多個segment,每一個segment都擁有不同的許可權,名稱。實際上,一個segment是對多個具有相同許可權的section的集合。
(8)安卓so庫win下怎麼調用擴展閱讀:
由於Android操作系統的底層基於Linux系統,所以SO文件可以運行在Android平台上。Android系統也同樣開放了C/C++介面供開發者開發Native程序。
由於基於虛擬機的編程語言JAVA更容易被人反編譯,因此越來越多的應用將其中的核心代碼以C/C++為編程語言,並且以SO文件的形式供上層JAVA代碼調用,以保證安全性。
而ELF頭表記錄了ELF文件的基本信息,包括魔數,目標文件類型(可執行文件,共享庫文件或者目標文件),文件的目標體系結構,程序入口地址(共享庫文件為此值為0),然後是section表大小和數目,程序頭表的大小和數目,分別對應的是鏈接視圖和裝載視圖。
linux系統下編譯的文件在windows下能運行嗎?
理論上說Linux系統編譯的文件是不能在Windows系統上執行的,因為Windows系統沒有Linux程序執行所依賴的.so和.a文件,.so和.a文件是Linux系統上的共享庫文件,Windows系統上也沒有Linux程序需要的系統調用(系統調用相當於Windows系統的API的概念),不同操作系統的二進制文件是不能通用的。但是現在情況有些不一樣了,新版的Windows10提供了WSL(是WindowsSubsystemforLinux的縮寫),可以在Windows10系統中運行Ubuntu、Fedora、SUSELinux,其實就是個子系統,在子系統內可以運行Linux程序,主要是為了吸引Linux的開發者用戶的。
linuxJni調用so文件建了測試WebProject寫了一個servlet執行調用,一啟動tomcatjvm崩潰了,錯誤日誌如下?
建議你在linux底下編譯so加-g選項,然後gdbjava,進去以後可以bc函數名來設置斷點,單步調試。或者生成core文件,再gdbjavacore看看崩潰堆棧上下文。推薦第一種方式。
Linux系統下.ko文件是什麼文件。so文件是什麼文件?
.so文件是動態鏈接庫文件,相當於win下的.dll文件。.ko是內核模塊文件,是內核載入的某個模塊,一般是驅動程序。