可以直接在android工程下使用,因?yàn)閍ndroid就是linux內(nèi)核。
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)洛江,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):028-86922220
android的NDK開(kāi)發(fā)需要在linux下進(jìn)行: 因?yàn)樾枰袰/C++編寫(xiě)的代碼生成能在arm上運(yùn)行的.so文件,這就需要用到交叉編譯環(huán)境,而交叉編譯需要在linux系統(tǒng)下才能完成。
2.安裝android-ndk開(kāi)發(fā)包,這個(gè)開(kāi)發(fā)包可以在google android : 通過(guò)這個(gè)開(kāi)發(fā)包的工具才能將android jni 的C/C++的代碼編譯成庫(kù)
3.android應(yīng)用程序開(kāi)發(fā)環(huán)境: 包括eclipse、java、 android sdk、 adt等。
NDK編譯步驟:
選擇 ndk 自帶的例子 hello-jni ,位于E:\android-ndk-r5\samples\hello-jni( 根據(jù)具體的安裝位置而定 ) 。
2.運(yùn)行 cygwin ,輸入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,進(jìn)入到 E:\android-ndk-r5\samples\hello-jni 目錄。
3.輸入 $NDK/ndk-build ,執(zhí)行成功后,它會(huì)自動(dòng)生成一個(gè) libs 目錄,把編譯生成的 .so 文件放在里面。 ($NDK是調(diào)用我們之前配置好的環(huán)境變量, ndk-build 是調(diào)用 ndk 的編譯程序 )
4.此時(shí)去 hello-jni 的 libs 目錄下看有沒(méi)有生成的 .so 文件,如果有,ndk 就運(yùn)行正常啦。
PC機(jī)
C程序移植
ANDROID
NDK效率更高
些(編程效率)
目前
用純C
實(shí)現(xiàn)安卓編程
linux
程序
移植更
便
windows
程序
更改
要
些
NDK相關(guān)
資料比較少
調(diào)試起
比較麻煩
現(xiàn)問(wèn)題
搜索起
比較費(fèi)事
工程
建議用java做
工程(幾十
CPP文件)
建議用NDK
我試了一下,jbuilder生成的exe文件,在沒(méi)有裝jre的機(jī)器上不能運(yùn)行,于是我就在該exe文件的同一位置提供一個(gè)jre目錄,可是該exe文件不會(huì)去自動(dòng)找這個(gè)jre,應(yīng)該怎樣做才能使exe文件找到這個(gè)jre,并運(yùn)行起來(lái)呢?
先寫(xiě)一個(gè)bak,檢查有沒(méi)有jre,有的話(huà)就直接運(yùn)行你的程序,沒(méi)有的話(huà),先安裝再執(zhí)行。
---------------------------------------------------------------
jbuilder有一個(gè)隱藏的技巧可以讓你從可執(zhí)行文件來(lái)啟動(dòng)java程序,(不出現(xiàn)console窗口我沒(méi)有做到)。需要jbuilderx的bin目錄下的這些文件:
jbuilder.exe
jbuilderw.exe (可選)
jbuilder.config
jdk.config
“jbuilder.exe”是一個(gè)通用的可執(zhí)行外殼文件,用以啟動(dòng)java程序,“jbuilderw.exe”好像是javaw.exe一樣,它把“jbuilder.exe”包裝起來(lái),但是運(yùn)行時(shí)候不顯示那個(gè)console的窗口。使用這些文件的關(guān)鍵是文件名?!癹builder.exe”查找一個(gè)文件叫“jbuilder.config”的配置文件,里面包含了運(yùn)行java程序的必須信息。同樣的“jbuilderw.exe”查找“jbuilder.exe”來(lái)啟動(dòng)不帶console窗口的java程序。如果把jbuilder.exe重命名為“foo.exe”,那“foo.exe”將去尋找“foo.config”配置文件,同樣“jbuilderw.exe”被重命名為“foow.exe”,它會(huì)去尋找“foo.exe”文件。
說(shuō)到這里,聰明的讀者應(yīng)該猜到怎樣利用jbuilder.exe來(lái)啟動(dòng)應(yīng)用程序了。只要把jbuilder.exe,jbuilerw.exe,jbuilder.config改名成相應(yīng)的文件名,在jbuilder.config里面指定主類(lèi)和類(lèi)路徑,就能夠通過(guò)執(zhí)行jbuilder.exe(或者被改名后的exe文件)來(lái)啟動(dòng)java應(yīng)用程序了。
在\jbuilderx\bin\目錄下,后把jbuilder.exe,jbuilder.config,jdk.config四個(gè)文件拷貝到某目錄下,然后打開(kāi)jbuilder.config文件,作相應(yīng)的修改:
在jbuilder.config里面找到下面兩行
# start jbuilder using the its main class
mainclass com.borland.jbuilder.jbuilder ----修改主類(lèi)為自己希望的類(lèi)
config里面可以識(shí)別的命令可以在jbuilder/bin目錄下的config_readme.txt里面找到詳細(xì)說(shuō)明。
然后修改jdk.config里面的javapath相對(duì)的路徑,例如原來(lái)是
javapath ../jdk1.3/bin/java ----修改主類(lèi)為自己打包的jre路徑(可以使相對(duì)路徑,如./jre)
最后將jbuilder.exe,jbuilder.config修改成所需要的文件名,例如foo.exe和foo.config文件。
下面的小技巧可能更有趣,將jar文件打包進(jìn)入exe文件!
將jar包附加到j(luò)builder.exe后面去,執(zhí)行過(guò)程:
copy /b ..\jbuilder.exe+hello.jar foo.exe
一個(gè)含jar包的exe文件得到了!
這個(gè)過(guò)程的大致原理是:exe文件的重要信息都在文件頭部,所以把亂七八糟的東西放exe文件尾部是不要緊的;而jar/zip文件的重要信息是在文件尾部的,這樣它們兩不相干,能夠容易的被執(zhí)行。
1. 自己寫(xiě).c文件,然后生成so庫(kù)
2. 引用別人的靜態(tài)庫(kù),或者動(dòng)態(tài)庫(kù)來(lái)生成新的jni調(diào)用庫(kù)。
我們先來(lái)看最簡(jiǎn)單的編寫(xiě)一個(gè)jni調(diào)用的so庫(kù),包含一個(gè)獲取字符串的方法,通過(guò)這個(gè)列子,我們主要是了解怎么在android的工程中調(diào)用jni的庫(kù),以及要注意的問(wèn)題。
第一步:首先我們來(lái)看下我們的工程的目錄
jni目錄是我們生成庫(kù)的文件,里面包含了一個(gè).mk編譯文件以及一系列的.c文件
libs目錄是我們編譯jni目錄下的mk文件動(dòng)態(tài)生成的。
當(dāng)我們寫(xiě)好了jni下面的庫(kù)文件以后,在當(dāng)前目錄下執(zhí)行ndk-build則會(huì)自動(dòng)生成我們需要調(diào)用的.so庫(kù)文件。
第二步: java里面怎么調(diào)用jni的庫(kù)文件,我們先看代碼
public class MainActivity extends Activity {
/* A native method that is implemented by the
* 'hello-jni' native library, which is packaged
* with this application.
*/
public native String stringFromJNI();
/* this is used to load the 'hello-jni' library on application
* startup. The library has already been unpacked into
* /data/data/com.example.HelloJni/lib/libhello-jni.so at
* installation time by the package manager.
*/
static {
System.loadLibrary("hello-jni");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String str = stringFromJNI();
System.out.println("*****str:" + str);
}
}
在java文件中要做到調(diào)用jni文件生成的so庫(kù),需要做到2步