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

ndkbuild編譯

發布時間: 2022-03-09 13:53:08

1. 用NDK來編譯程序不成功

你的環境配置方法已經很老了,我在「網路經驗」上有一篇文章「android ndk環境配置」,是關於高版本的ndk r10的環境配置,不需要cgywin,而且很簡單,希望對你有用;如果還有疑問可以在我的網路經驗留言,謝謝!

2. Android studio使用NDK編譯問題

NDK編譯步驟:
1.選擇 ndk 自帶的例子 hello-jni ,我的位於E:\android-ndk-r5\samples\hello-jni( 根據具體的安裝位置而定 ) 。
2.運行 cygwin ,輸入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,進入到 E:\android-ndk-r5\samples\hello-jni 目錄。
3.輸入 $NDK/ndk-build ,執行成功後,它會自動生成一個 libs 目錄,把編譯生成的 .so 文件放在裡面。 ($NDK是調用我們之前配置好的環境變數, ndk-build 是調用 ndk 的編譯程序 )
4.此時去 hello-jni 的 libs 目錄下看有沒有生成的 .so 文件,如果有,ndk 就運行正常啦。

3. 編譯android項目時 ndk-build編譯,出錯,請幫忙看看

jni版本不對。我看過源碼。在你的平台jni版本小於給定的。就會報錯

4. eclipse會自動調用ndk-build編譯jni嗎

一、寫好c代碼後,然後用cygwin搭建ndk-build環境,用ndk-build來編譯出相關的.so文件(libs目錄)之後,

再用eclipse里去編譯java程序,從而使用.so文件。該方法在上一篇搭建NDK環境有介紹。

二、利用eclipse完全可以達到編譯.so的目的。

首先,先裝上CDT吧,這是Eclipse的C/C++環境插件,裝上它後你就可以在Eclipse里創建C/C++項目和代碼文件了。插件的安裝有兩種方式,一種是在線安裝,一種是下載安裝包自己安裝,這里只介紹第一種方式,另一種方式可自行網路。首先登錄http://www.eclipse.org/cdt/downloads.php,找到對應你Eclipse版本的CDT插件的在線安裝地址,如下圖所示:,找到對應你Eclipse版本的CDT插件的在線安裝地址,如下圖所示:

2、找到對應你
eclipse版本的CDT插件地址,之後打開Eclipse,點Help菜單,找到Install New
Software菜單,注意一些老版本的Eclipse菜單不太一樣,比如說Europa的版本,就是Help--Software
Updates—Find and Install--Search for new features to install--New Remote
Site,除了菜單不太一樣外,安裝方式都差不多,可自行網路一下,下圖以Indigo版本為准:

3、把取的地址填進去,出來插件列表後,選Select All,如下圖所示:

然後狂點下一步即可完成安裝。

也可以點擊Add按鈕用離線方法安裝。出現該對話框,點擊Archive按鈕,選擇之前下載的離線安裝包,安裝過程同在線安裝。

4、安裝完成後,點菜單File-New-Project,出現新建項目界面,如果出現了C/C++項目,那麼恭喜你,CDT安裝也完成了,如下圖所示:

5、
不過光有CDT還不行,CDT編譯代碼還是需要調用cygwin當中的編譯工具進行,所以我們還需要手動配置C/C++的編譯器,還是以NDK自帶的
hello-jni為例子,首先打開
Eclipse,File->New->Project->Android->Android
project->next,在New Android Project選項卡中,選Create project from existing
source;在Location:按Browse找到NDK自帶的Hello-jni目錄。

選擇Android SDK版本後,點擊Finish,完成導入。

6、 把這個項目導入進來,導入後如下圖所示:

7、 編譯C文件:

右鍵單擊HelloJni之後,點擊Properties,彈出配置界面,之後再點擊Builders,如下圖所示:

點擊New按鈕,新添加一個編譯器,點擊後出現添加界面,選擇Program,點擊OK:

8、 點擊OK後,出現了添加界面:

在Main Tab界面, 填充以下內容:
Name:

編譯器名稱,隨便填寫。如:NDK_Builder

Location:

可執行工具的位置。即NDK安裝目錄下ndk-build.cmd的位置。

你可以點擊Browser File System...按鈕選擇Android NDK安裝目錄下的ndk-build.cmd文件來指定Location。如下圖:

你也可以設置一個變數來指定Android NDK的安裝目錄後設置Location。點擊Variables按鈕指定。如下圖:

出現選擇Variable的選擇框。

單擊Edit Variables...按鈕。出現Variable管理的界面。單擊New按鈕添加Variable。

輸入Variable的名稱,如:ndk_home。然後單擊Browse...按鈕,選擇Android NDK的安裝目錄後,單擊OK。

至此,NDK的Variable設置完成。

然後,單擊Main Tab界面上Location的Variables...按鈕,選擇剛才設置的ndk_home變數。如下圖:

單擊OK後,在Location的編輯框里會有選擇的ndk-home變數,在其後面添加上/ndk-build.cmd,OK,Location設置完成。

如下圖:

Working Directory:

要編譯的C/C++程序的工作目錄。一般指定到jni文件夾,因為所有的C/C++程序都在該文件夾內實現。

首先選擇Working Directory里的Browse Workspace...按鈕,如下圖:

然後,選擇要編譯的項目HelloJni的jni文件夾。

9、 接著切換到Refresh選項卡,給Refresh resources upon completion打上鉤,選擇The Project containing the selected resource項,

表示只更新包含選中資源的項目,選中的資源項就是Main Tab選擇的jni文件夾。

完成後如下圖:

10、 最後切換到Build Options選項卡,勾選During auto builds,如下圖所示:

Specify Resources 按鈕單擊後,選擇HelloJni項目的 jni 文件夾。

11、單擊 Apply OK 確認設置後,確保此 NDK 構建工具設置為列表中的第一個條目,方法是選擇 Up 按鈕,直到其位於 Builders 列表的頂部

記得一定要點Up按鈕,把它排到第一位,否則C代碼的編譯晚於Java代碼的編譯,會造成你的C代碼要編譯兩次才能看到最新的修改,排到第一位後如下圖所示:

12、 現在再次恭喜你,編譯配置也配置完成啦,那麼來試試看是否可以自動編譯吧,打開左側jni目錄里的hello-jni.c文件把提示Hello from JNI!改改,如下圖所示:

單擊項目,選擇Build Project後,在HelloJni項目下會多出libs文件夾,.so文件就存放在這里。

另外在Console控制台會輸出成功編譯的提示信息。

編譯之後點擊run按鈕跑起來看看吧,如果模擬器當中出現了你新修改的提示信息,那麼再一次恭喜你,已經全部配置成功了!

5. android開發,怎麼使用ndk編譯成.so文件

一、首先下載android-ndk,官方網站是:http://developer.android.com/tools/sdk/ndk/index.html
目前最新的版本是android-ndk-r8e-windows-x86.zip,下載地址:
http://dl.google.com/android/ndk/android-ndk-r8e-windows-x86.zip
下載後把壓縮解壓出來,例如:D:\ndk,目錄下的ndk-build.cmd就是用來編譯的批處理命令。
二、編譯,打開cmd命令行窗口,cd進入目錄:D:\ndk\samples\hello-jni,
然後執行命令:D:\ndk\ndk-build.cmd(如果設置過環境變數則直接使用ndk-build.cmd)來編譯hello-jni,如果沒有錯誤會輸出:
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
"Compile thumb : hello-jni <= hello-jni.c
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
三、創建android應用程序並使用so文件
打開eclipse創建一個android應用程序HelloJni,默認的com.example.hellojni包下面有一個MainActivity.java,
在此包下添加一個HelloJni.java,

6. ndk-build 怎樣同時編譯多個so

(1)Android.mk文件首先需要指定LOCAL_PATH變數,用於查找源文件。由於一般情況下

Android.mk和需要編譯的源文件在同一目錄下,所以定義成如下形式:

LOCAL_PATH:=$(call my-dir)

上面的語句的意思是將LOCAL_PATH變數定義成本文件所在目錄路徑。

(2)Android.mk中可以定義多個編譯模塊,每個編譯模塊都是以include $(CLEAR_VARS)開始

以include $(BUILD_XXX)結束。

include $(CLEAR_VARS)

CLEAR_VARS由編譯系統提供,指定讓GNU MAKEFILE為你清除除LOCAL_PATH以外的所有LOCAL_XXX變數,

如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。

include $(BUILD_STATIC_LIBRARY)表示編譯成靜態庫

include $(BUILD_SHARED_LIBRARY)表示編譯成動態庫。

include $(BUILD_EXECUTABLE)表示編譯成可執行程序。

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

8. 如何把ndk-build生成的.o文件編譯到動態庫

個人建議,安裝新建一個工程,把所有的.o文件一起打包生成.a 文件後,再在以後的項目中直接使用.a文件;

9. ubuntu如何利用ndk-build生成.so文件在終端輸入顯示沒有那個文件或目錄怎麼辦!!!

ndk-build 找的是jni目錄,把你build的文件放到jni目錄裡面,ndk-build jni/

10. ndk-build編譯不過,是怎麼回事,

很好的帖子,難得一見 查看原帖>>

熱點內容
路由器忘記密碼如何解 發布:2025-01-22 07:38:47 瀏覽:153
5分鍾視頻編譯 發布:2025-01-22 07:36:33 瀏覽:771
asp執行存儲過程 發布:2025-01-22 07:35:55 瀏覽:126
鎮政府搭建伺服器 發布:2025-01-22 07:32:13 瀏覽:1000
安卓系統可以查去過哪裡嗎 發布:2025-01-22 07:25:05 瀏覽:27
三星手機怎麼設置熱點密碼 發布:2025-01-22 07:20:11 瀏覽:38
Ip呼叫伺服器 發布:2025-01-22 07:19:32 瀏覽:633
輕量級伺服器搭建sk5 發布:2025-01-22 07:19:26 瀏覽:65
如何拔卡安卓避免鎖區 發布:2025-01-22 07:16:41 瀏覽:200
python畫柱狀圖 發布:2025-01-22 07:11:44 瀏覽:440