ndkbuild編譯
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編譯不過,是怎麼回事,
很好的帖子,難得一見 查看原帖>>