ndk自動編譯
1. eclipse ndk自動編譯為什麼沒有生成頭文件
1.首先你的NDK是配好的,這里需要你在用戶環境變數上添加環境變數A_buildCommond,變數值:G:/Android/android-ndk-r9d/ndk-build.cmd
我的NDK是r9d在G:\android下面,上面變數的值斜杠不是反的
2 在系統環境變數Path目錄下同樣復制上面的變數值,G:/android/android-ndk-r9d/ndk-build.cmd之後重啟電腦,不重啟後果自負。.
3.打開你的eclipse這里你的eclipse應該已經是配置好SDK和Ndk的,創建一個Android Application程序,然後 new->other,轉化為C/C++工程
4,Next>選擇Makefile project 和Cygwin GCC 然後finish
6.OK現在開始寫native函數,這里在MainActivity。java里寫上 public native String hellJNI();函數,
[java] view plain
<p>package com.lipeng.testjnihello;</p><p>import android.app.Activity;
import android.os.Bundle;</p><p>
public class MainActivity extends Activity {</p><p> @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public native String hellJNI();</p><p>
}
</p>
2. android ndk zip 怎麼使用
解壓啊!在工具中設置下ndk路徑就行了!
3. linux下NDK編譯出的SO庫能在WIndows下的android工程直接使用么
是在windows下做開發的,但是編譯環境還是在linux上。。大體的步驟如下:
1.首先在windows環境下編寫工程(eclipse下編寫android工程)
2.打開linux開發環境(tcl平台:\\10.120.90.207\longc\workspace\code\project\kernel\android\JB)
3.將運行環境的腳本文件運行./evnsetup:配置android運行環境
/JB/build/
找到envsetup.sh
運行.envsetup.sh(source envsetup.h或./envsetup)
所有操作都在終端完成
4.將工程文件拷貝到指定目錄下(TCL平台下的自帶程序在package\TCL_Apps目錄下)
5.刪除一些文件
保留/res,/src,AndroidManifest.xml三個文件
創建Android.mk(makefile文件,linux下用makefile文件來集成一些命令,運行程序的指令和設置都在此處)Android.mk的編寫
6.編譯
進入工程文件目錄
輸入mm命令進行編譯。
7.生成apk文件,編譯完成
4. android ndk到底是什麼
NDK是一系列工具的集合。它提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk(AndroidPackage的縮寫,Android安裝包)。這些工具對開發者的幫助是巨大的。它集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。它可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
NDK提供了一份穩定、功能有限的API頭文件聲明,Google明確聲明該API是穩定的,在後續所有版本中都穩定支持當前發布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標准庫(libc)、標准數學庫(libm)、壓縮庫(libz)、Log庫(liblog)。
5. 如何用Android NDK編譯FFmpeg
android的NDK開發需要在linux下進行:
因為需要把C/C++編寫的代碼生成能在arm上運行的.so文件,這就需要用到交叉編譯環境,而交叉編譯需要在linux系統下才能完成。
安裝android-ndk開發包,這個開發包可以在google android 官網下載: 通過這個開發包的工具才能將android jni 的C/C++的代碼編譯成庫
android應用程序開發環境: 包括eclipse、java、 android sdk、 adt等。
NDK編譯步驟:
a.選擇ndk自帶的例子hello-jni,我的位於E:android-ndk-r5sampleshello-jni(根據具體的安裝位置而定) 。
b.運行cygwin,輸入命令cd /cygdrive/e/android-ndk-r5/samples/hello-jni,進入到E:android-ndk-r5sampleshello-jni目錄。
c.輸入$NDK/ndk-build,執行成功後,它會自動生成一個libs目錄,把編譯生成的.so文件放在裡面。($NDK是調用我們之前配置好的環境變數,ndk-build是調用ndk的編譯程序)
d.此時去hello-jni的libs目錄下看有沒有生成的.so文件,如果有,ndk就運行正常啦。
6. 如何在windows上用ndk交叉編譯其他平台程序
目標 :編譯arm64的.so庫
編譯方法:理論上應該有兩種交叉編譯方法,法一,在Linux伺服器上安裝交叉工具鏈,直接用交叉工具鏈進行編譯鏈接;法二,使用ndk完成交叉編譯,因為
ndk已經安裝好交叉編譯工具鏈,以及相關的系統庫和系統頭文件了。這兩種方法的區別在於,linux伺服器上的編譯使用的makefile和ndk使用的.mk
文件顯然不同。原因是ndk作為一個集成編譯環境,制定了一套特定的規則用於生成最終的編譯腳本。
這里簡單總結下,如何在windows用ndk進行交叉編譯arm64目標平台的.so庫:
step1:找到ndk開發工具包,官網之類的都可以下載,Android-ndk64-r10-windows-x86_64.rar文件
step2:解壓上述ndk工具包,將包含程序源文件和頭文件的文件夾testProject都放入android-ndk-r10下的samples目錄下。
放在其他地方當然也可以,但是後續相對路徑之類的不太好加,既然其他例子都放這,把代碼放這編譯是最保險的了。
step3:在testProject中增加一個jni的文件夾,必須要添加!!!!!!
step4:在jni文件夾中,添加一個Android.mk的文件,必須要添加!!!!!
step5:在jni文件夾中,添加一個Application.mk的文件與Android.mk並列,必須要添加!!!!!
step6:Android.mk和Application.mk合起來就類似於linux環境下的makefile編譯文件。
如何寫Android.mk,可以參考例子helllo-jni中jni文件夾下的Android.mk。
LOCAL_PATH:=$(call my-dir) #必須要寫的
include $(CLEAR_VARS) #必須要寫的
LOCAL_MODULE:=hello-jni #編譯出來的模塊名稱
LOCAL_SRC_FILES:=hello-jni.c #制定編譯的源文件名稱
include $(BUILD_SHARED_LIBRARY)#放在最後
除了上述變數之外,還有其他的指定的變數,
LOCAL_CFLAGS,用於指定編譯選項,這個和makefile中是完全一樣的,可以指定編譯選項-g,也可以指定編譯宏及宏值
LOCAL_LDLIBS,用於指定鏈接的依賴庫,這個可以makefile也是完全一樣的,可以指定鏈接庫用-l庫名,以及指定庫搜索路徑用_L路徑名
LOCAL_STATIC_LIBRARIES,指定鏈接的靜態庫名,makefile中沒有
LOCAL_C_INCLUDES,用於指定編譯頭文件的路徑,和makefile中不同,路徑前不需要加-I,直接寫路徑即可,可以是相對路徑或絕對路徑,
多個路徑之間用空格隔開。
編寫上述Android.mk碰到的問題有,
(1)使用默認的系統自動載入stl庫頭文件總是出錯,只好手動在LOCAL_STATIC_LIBRARIES指定sources/cxx-stl/stlport/stlport來完成對#include<string>這種c++形式的頭文件載入
(2)使用$(SYSROOT)/usr/include來完成對系統庫頭文件的載入,結果找不到sem_t符號,只好指定platforms/android-L/arch-arm64/usr/include
step7:Application.mk編寫
APP_STL指定使用的stl移植庫,動態或者靜態都行
APP_CPPFLAGS,指定app編譯的編譯選項
APP_ABI指定abi規范類型,例如arm64-v8a,也可以寫成ALL就是把所有的類型全部編一編
APP_PLATFORM指定編譯的platform名稱,這里可以寫成android-L或者不指定全編。
step8:編譯完成後,運行。
啟動cmd,使用cd /D進行到testProject的jni目錄下
step9:將android-ndk-r10下的ndk-build.cmd直接拖拽到cmd中,此時直接敲回車,就可以編譯了。當然也可以加一個 clean,清除編譯中間文件。
step10:檢查下編譯結果,編譯成功後在testProject中多了兩個文件夾與jni並列的,libs和obj。
編譯鏈接後的結果就在libs中!
7. 如何把ndk編譯出來的可執行文件偽裝成so打包到apk中
ndk編譯出來的共享庫,eclipse會自動打包到apk中,而編譯出來的可執行文件則不會。 要想可執行文件自動被打包到apk中,可以把文件名改成libxxx.so的形式,偽裝成so,這樣就會被打包進apk。 但是每次編譯之後都改一下名字,太麻煩, 寫個腳本吧,又有arm, arm
ndk編譯出來的共享庫,eclipse會自動打包到apk中,而編譯出來的可執行文件則不會。
要想可執行文件自動被打包到apk中,可以把文件名改成libxxx.so的形式,偽裝成so,這樣就會被打包進apk。
但是每次編譯之後都改一下名字,太麻煩,
寫個腳本吧,又有arm, armv7, x86的麻煩事,
想試著改LOCAL_MODULE_FILENAME來試試,NDK又不允許。
於是稍微看了下NDK的編譯腳本,發現如下解決辦法。
NDK是通過在Android.mk文件中include $(BUILD_EXECUTABLE)來編譯可執行文件,其實就是調用了一個已經寫好的腳本——build-executable.mk。(編譯腳本都在NDK_ROOT/build/core目錄裡面)
仔細看腳本的調用過程可以發現,腳本一開始先檢查一下變數合法性(前面改LOCAL_MODULE_FILENAME的方法在這里過不去),最終調用include$(BUILD_SYSTEM)/build-mole.mk來編譯。
於是研究這個腳本,找到決定編譯輸出的變數,在調用最終的編譯腳本之前改成想要的就可以了。
最終我的方案如下:
1. 為了不破壞ndk本來的腳本,將build-executable.mk拷貝一份放在自己的工程目錄下面,在倒數第三行插入一句?$(evalLOCAL_BUILT_MODULE := $(TARGET_OUT)/$(MY_LOCAL_MODULE_FILENAME))
2. 在自己的Android.mk文件中定義MY_LOCAL_MODULE_FILENAME變數,當然值就是你想要的文件名啦
3. 編譯時不調用系統的include$(BUILD_EXECUTABLE), 而改調用自己的腳本(就是上面拷貝出來且做了修改的那個腳本),為了方便,你可以給自己的腳本定義一個變數來指向它。
就是這樣。
寫得比較亂,貼幾段關鍵代碼吧。
修改後的build-executable.mk代碼。
LOCAL_BUILD_SCRIPT := BUILD_EXECUTABLE
LOCAL_MAKEFILE := $(local-makefile)
$(call check-defined-LOCAL_MODULE,$(LOCAL_BUILD_SCRIPT))
$(call check-LOCAL_MODULE,$(LOCAL_MAKEFILE))
$(call check-LOCAL_MODULE_FILENAME)
# we are building target objects
my := TARGET_
$(call handle-mole-filename,,)
$(call handle-mole-built)
$(eval LOCAL_BUILT_MODULE := $(TARGET_OUT)/$(MY_LOCAL_MODULE_FILENAME))
LOCAL_MODULE_CLASS := EXECUTABLE
include $(BUILD_SYSTEM)/build-mole.mk
14行就是我們加的那一行。
上面的文件放在jni根目錄,跟目錄下的Android.mk代碼:
MY_BUILD_EXECUTABLE := $(JNI_ROOT)/build-executable.mk
include $(call all-subdir-makefiles)
需要編譯可執行文件的模塊這樣寫:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := ...
LOCAL_MODULE := xxx
MY_LOCAL_MODULE_FILENAME := libxxx.so
LOCAL_C_INCLUDES := ...
LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -llog
LOCAL_CFLAGS := -fPIC
include $(MY_BUILD_EXECUTABLE)。
8. android ndk有什麼用
NDK是什麼
對NDK進行了粗略的研究後,我對「NDK是什麼」的理解如下:
1、NDK是一系列工具的集合。
NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。
NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。
NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
2、NDK提供了一份穩定、功能有限的API頭文件聲明。
Google明確聲明該API是穩定的,在後續所有版本中都穩定支持當前發布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標准庫(libc)、標准數學庫(libm)、壓縮庫(libz)、Log庫(liblog)。
4、NDK帶來什麼
1) NDK的發布,使「Java+C」的開發方式終於轉正,成為官方支持的開發方式。
使用NDK,我們可以將要求高性能的應用邏輯使用C開發,從而提高應用程序的執行效率。
使用NDK,我們可以將需要保密的應用邏輯使用C開發。畢竟,Java包都是可以反編譯的。
NDK促使專業so組件商的出現。(樂觀猜想,要視乎Android用戶的數量)
2)NDK將是Android平台支持C開發的開端。
NDK提供了的開發工具集合,使開發人員可以便捷地開發、發布C組件。同時,Google承諾在NDK後續版本中提高「可調式」能力,即提供遠程的gdb工具,使我們可以便捷地調試C源碼。在支持Android平台C開發,我們能感覺到Google花費了很大精力,我們有理由憧憬「C組件支持」只是Google Android平台上C開發的開端。畢竟,C程序員仍然是碼農陣營中的絕對主力,將這部分人排除在Android應用開發之外,顯然是不利於Android平台繁榮昌盛的。
9. Android NDK 為什麼會一直重復的自動編譯
你是直接使用命令行編譯的?還是使用eclipse編譯的?如果是使用eclipse編譯的,那麼當你在修改其中jni調用的c++代碼的時候,會自動編譯jni調用的庫。這個可以在工程屬性裡面你自己新建的builder裡面設置,具體是在刷新那一項。你可以再詳細看看。