當前位置:首頁 » 編程軟體 » cygwin編譯so

cygwin編譯so

發布時間: 2023-01-02 12:16:12

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

㈡ matlab程序移植到安卓,應該怎麼做

方法如下:
1、將Matlab重寫為C,在高版本Matlab里找應用程序編譯器功能,選擇生成C/C++ Static Library並選中Generate code only。
2、然後用cygwin編譯成*.so庫。
3、Android中使用JNI調用。
注意:不是Matlab和C混合編譯,混合編譯你要有Matlab的解釋器才可以。
Matalb中一個簡單的Sobel運算元重寫為C,就生成了如下一堆代碼

㈢ java jni 怎麼在windows環境中編譯成linux下的so文件

可以直接在android工程下使用,因為android就是linux內核。

  • android的NDK開發需要在linux下進行: 因為需要把C/C++編寫的代碼生成能在arm上運行的.so文件,這就需要用到交叉編譯環境,而交叉編譯需要在linux系統下才能完成。

  • 2.安裝android-ndk開發包,這個開發包可以在google android : 通過這個開發包的工具才能將android jni 的C/C++的代碼編譯成庫

  • 3.android應用程序開發環境: 包括eclipse、java、 android sdk、 adt等。

  • NDK編譯步驟:

  • 選擇 ndk 自帶的例子 hello-jni ,位於E:android-ndk-r5sampleshello-jni( 根據具體的安裝位置而定 ) 。

  • 2.運行 cygwin ,輸入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,進入到 E:android-ndk-r5sampleshello-jni 目錄。

  • 3.輸入 $NDK/ndk-build ,執行成功後,它會自動生成一個 libs 目錄,把編譯生成的 .so 文件放在裡面。 ($NDK是調用我們之前配置好的環境變數, ndk-build 是調用 ndk 的編譯程序 )

  • 4.此時去 hello-jni 的 libs 目錄下看有沒有生成的 .so 文件,如果有,ndk 就運行正常啦。

㈣ windows下如何用cygwin 編譯gmp

cygwin可以編譯生成windows下供調用的dll,包括vc可識別的lib。

Cygwin-GCC : Cygwin自帶了一個GCC,用於把C/C++-Source編譯成Cygwin平台下的EXE/DLL (使用Cygwin必須用其自帶的GCC, 因為內部會生成一些針對於平台的特定的初始化代碼,如果用其餘版本的GCC則很有可能導致程序不能正常運行.)

Cygwin-GCC : Cygwin自帶了一個GCC,用於把C/C++-Source編譯成Cygwin平台下的EXE/DLL (使用Cygwin必須用其自帶的GCC, 因為內部會生成一些針對於平台的特定的初始化代碼,如果用其餘版本的GCC則很有可能導致程序不能正常運行.)

說明 - Cygwin-GCC :

在Cygwin-Shell中可直接使用gcc .如下 :

gcc -shared xxx.c -o xxx.dll //編譯成DLL, 注意,Cygwin-GCC默認導出所有的Function.

gcc -c xxx.c -o xxx.o //編譯成OBJ

gcc xxx.c -o xxx.exe //編譯成EXE

ar r xxx.lib xxx1.o xxx2.o //打包多個obj成一個Lib (非連接)

gcc xxx.c ./L aaa.dll -o xxx.exe //引用外部DLL生成EXE

gcc xxx.c yyy.c -o zzz.exe //連接多個C文件,生成EXE.

gcc -I"/bin/include"-c xxx.c -o xxx.o //引用/bin/include目錄下頭文件,生成OBJ

gcc -L"dll.a" xxx.c -o xxx.exe //連接dll.a,生成EXE

如果想知道編譯時具體的信息,可以使用--verbose這個編譯選項,對於了解GCC的工作是很有幫助的.

額外的,也可以寫自己的導出Lib文件,以方便其餘程序引用DLL (如Cobol2002編譯器就不支持直接引用DLL, 這個時候可以寫一個Def,並導出Lib文件,便於Cobol2002使用)

具體方法如下:

1. 編譯生成DLL :

如: gcc -shared MyTest.c -o MyTest.dll, 生成MyTest.dll.

2. 寫一個DEF文件 (這里是MyTest.def),簡單的格式大致如下:

LIBRARY MyTest //這里的MyTest對應於MyTest.dll
EXPORTS
AllocMemory @1 //導出的第一個function : 對應於MyTest.dll裡面的AllocMemory(...), 注意,參數可不用寫
ReadMemory @2 //導出的第二個function : 對應於MyTest.dll裡面的ReadMemory-Function.

//注意:function可以不用全部導出,可以只選擇你需要的Function.

3. 用LIB工具(VC6有提供)生成LIB文件 (這里是MyTest.lib) :

lib /def:MyTest.def //默認生成的名稱為MyTest.lib.

4. 到此生成完畢,連接的時候只需要引用MyTest.lib即可,但要注意XXX.exe 和MyTest.dll要放在同一目錄下.

可以用 gcc --help 查看具體的命令 etc...

㈤ 如何在Eclipse中如何用cygwin把C文件編譯成so文件

用cygwin把C文件編譯成so文件:

1:首先,要准備好一個jni文件夾,裡麵包含三個文件:

makefile文件:

LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=test-jni
LOCAL_SRC_FILES := test-jni.c
include $(BUILD_SHARED_LIBRARY)

如果有多個文件,可能有所不同吧,尚未嘗試。


頭文件:最好使用javah命令來生成,可見我的上一篇文章;

源文件:根據頭文件,完善源碼。


2:將jni文件夾拷貝到Android項目目錄下

3:運行cygwin,使用CD命令,切換目錄到Android項目目錄

4:輸入命令$NDK/ndk-build,屏幕顯示如下:

$ $NDK/ndk-build
Cygwin : Generating dependency file converter script
Compile thumb : test-jni <= test-jni.c
SharedLibrary : libtest-jni.so
Install : libtest-jni.so => libs/armeabi/libtest-jni.so

表示生成成功。

㈥ cygwin下可以編譯android源碼嗎

cygwin下可以編譯android源碼。

1.Cygwin簡介
Cygwin是在Windows下模擬Linux環境的工具集,它主要包含一下兩個部分:
1) cywin1.dll : 該文件模擬了真是的LinuxAPI,是一個API模擬層,開發人員可以將在Linux下編寫的C/C++ 源代碼在Cygwin中進行編譯,在編譯的過程中,如果C/C++ 調用了Linux中的API,Cygwin就會利用cygwin1.dll 來編譯 C/C++源代碼,從而可以在windows下生成Linux下的lib...so文件
2) 模擬Linux環境的工具集

另外,msys也是在windows 下模擬linux環境的工具。

熱點內容
戰地5默認是什麼伺服器 發布:2025-09-18 17:59:32 瀏覽:296
安卓變ios系統主題怎麼弄 發布:2025-09-18 17:54:07 瀏覽:875
linux出口ip 發布:2025-09-18 17:51:57 瀏覽:936
androidbitmap使用 發布:2025-09-18 17:49:20 瀏覽:230
數字日期加密 發布:2025-09-18 17:43:46 瀏覽:495
網吧電腦顯示未連接上桌面伺服器 發布:2025-09-18 17:37:17 瀏覽:693
電腦壓縮文件怎麼解壓 發布:2025-09-18 17:27:59 瀏覽:383
資料庫數據類型表 發布:2025-09-18 17:11:56 瀏覽:27
java如何生產執行bat腳本 發布:2025-09-18 16:53:25 瀏覽:556
湖北的伺服器地址是多少 發布:2025-09-18 16:51:09 瀏覽:490