Android NDK開發 Android JNI專案建立
本篇文章只介紹android ndk在windows系統的編譯環境配置方法
更新於2015年1月11日
將更加詳細的介紹一個基本的Android Jni專案的建立。
步驟一:下圖是必須的,配置好這一步驟就可以進行Android JNI專案的建立了。
步驟二:新建一個Android專案,大家都會的,圖片就不貼了。
步驟三:專案右鍵 -->Android Tools -->Add Native Support,然後彈出下圖,填寫的lib名稱就是要用到的庫
步驟四:上述步驟完成就工程出現了 jni 資料夾
步驟五:開啟TestNdk1.cpp檔案是下圖:
步驟六:會出現以下問題,說明是一些檔案庫沒有包含進去,所以我們做如下配置
專案--> 右鍵properties -->c/c++ General 如下圖:
步驟七:點選Add出現如下:
步驟八:點選File system 選擇路徑NDK下的 D:\android-ndk-r9d\platforms\android-9\arch-arm\usr\include; NDK的版本和android-的版本根據自己的情況作出選擇;
;OK之後會彈出選擇是否重新編譯,選擇YES;如果發現 jni目錄下的的TestNdk1.cpp的錯誤提示沒有了,就成功了。
同時還需要設定一個屬性。工程--->右鍵properties ---->C/c++ Build 在Builder Settings下取消掉use default build command 然後在Build Command中填上Ndk下的ndk-build.cmd的路徑。
步驟九:接下來建立一個頭檔案
標頭檔案的樣例程式碼如下,以後的程式碼都可以用這個樣例進行修改:(做了一個Add函式和一個返回字串的函式)
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_jni_TestJni */ #ifndef _Included_com_example_testndk1_TestJni #define _Included_com_example_testndk1_TestJni #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_jni_TestJni * Method: add * Signature: (II)I */ JNIEXPORT jint JNICALL Java_com_example_testndk1_TestJni_Add(JNIEnv *, jobject, jint, jint); JNIEXPORT jstring JNICALL Java_com_example_testndk1_TestJni_getString(JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
詳解: <1>JNIEXPORT和JNICALL都是JNI的關鍵字,表示此函式是要被JNI呼叫的。
<2>JNIEnv型別實際上代表了Java環境,通過這個JNIEnv* 指標,就可以對Java端的程式碼進行操作。例如,建立Java類中俄物件,呼叫Java物件的方法,獲取Java物件中的屬性等等。JNIEnv的指標會被JNI傳入到本地方法的實現函式中來對Java端的程式碼進行操作。
<3>Java_com_example_testndk1_TestJni_add的起名方式:Java+包名+類名+方法名; “+” 用 “_”替代。方法名嚴格控制!!!!
<4>jstring 和 jint 是指的一個返回值型別;在#ifndef中需要修改後面的 包名_類名;
<5>注意類名,這個類名值的是獲取 c/c++方法的 Java類; 接下來建立這個類,看下圖:
步驟十:上面我們建立好了 呼叫Java類 和呼叫的 標頭檔案介面; 但是我們還沒具體函式的具體實現方式,我們在jni目錄下生成的TestNdk.cpp內實現具體方法。程式碼如下:
#include <jni.h>
#include <stdio.h>
#include <math.h>
#include "TestNdk1.h"
JNIEXPORT jint JNICALL Java_com_example_testndk1_TestJni_Add(JNIEnv *, jobject,
jint x, jint y) {
return x + y;
}
JNIEXPORT jstring JNICALL Java_com_example_testndk1_TestJni_getString(
JNIEnv *env, jobject) {
return env->NewStringUTF("HelloWorld From TestNdk1.");
}
注意把建立的標頭檔案包含到裡面進去。
步驟十一:接下來就是Android Activity中的實現和呼叫了。最主要的就是裝載庫,建立自己建立的JNI類的物件。、
首先先建立一個類,來實現JNI的呼叫。如下類:
package com.example.testndk1;
public class TestJni {
public native int Add(int x, int y);
public native String getString();
}
在下面可以直接呼叫該類
package com.example.testndk1;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView textView;
//把建立的.so檔案裝載進去,這個是自己設定的那個名稱。
static {
System.loadLibrary("TestNdk1");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//建立TestJni物件。
TestJni testJni = new TestJni();
textView = (TextView) findViewById(R.id.tv);
//呼叫我們的Add方法
int i=testJni.Add(2, 5555);
// testJni.getString();
//把返回的字串和計算出的結果顯示在Textview上。
textView.setText(testJni.getString()+"\n"+String.valueOf(i));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
步驟十二:綜上我們就可以在運行了。
在執行時,console內會顯示如下內容,出現這個就編譯成功了。
D:\android-ndk-r9d\ndk-build.cmd all
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
[armeabi] Install : libTestNdk1.so => libs/armeabi/libTestNdk1.so
**** Build Finished ****
下圖是執行成功了
綜上就是一個具體的工程。希望大家支援啊。內容我也會不斷的更新,希望大家多支援,多評論會定時回覆。轉載請標明出處哦!!
這個工程下載地址:http://download.csdn.net/detail/fengzy1990/8351575;
上面看懂了,下面的可以稍微看看。
本文寫於2014年4月,更新本文時間於2015年1月8日
更新內容:從Android NDK的初始開發到現在NDK-r10版本,NDK的環境搭載變得更加容易了。
從NDK-R7版本以上NDK就集成了Cygwin,所以就不需要下載Cygwin。
只需要下載NDK後解壓,然後在Eclipse中配置上NDK的路徑就可以了。
以下2014年4月寫;
一、
1、在google官網上下載Android NDK的壓縮包,下載網站http://developer.android.com/tools/sdk/ndk/index.html;將解壓到E:\Android\android-ndk
2、下載並安裝Cygwin。windows系統需要直接進行交叉編譯,因此需要安裝一個Linux的模擬器Cygwin。到http://www.cygwin.com下載。
3、配置Cygwinde NDK的開發環境,預設Cygwin會安裝在C盤的根目錄下,修改為c://cygwin/home/username。 bash_profile檔案,username會根據使用者使用的使用者名稱而變化。在.bash_profile檔案的結尾處新增如下程式碼:
ANDROID_NDK_ROOT=/cygdrive/e/android/android-ndk
export ANDROID_NDK_ROOT
上面的程式碼說明了android ndk的所在目錄
最後一步是測試開發環境是否正常工作,首先啟動Cygwin,然後切換到<Android NDK>/build目錄中,執行host-setup.sh檔案。如果出現
到此為止,編譯華寧已經安裝配置完畢。
android ndk安裝目錄包括5個子目錄
+apps 是android工程的儲存目錄。裡面有hello-jin和tow-libs是NDK自帶的兩個示例目錄。
+build 儲存了交叉編譯工具、編譯指令碼、配置檔案
+ docs 是幫助文件的儲存目錄。
+out 是交叉編譯的輸出目錄,儲存輸出的so檔案。
+sources 是C/C++原始碼檔案的儲存目錄,下面的hello-jin和tow-libs子目錄,分別儲存了NDK自帶示例所需要的C/C++原始碼檔案。 GNUmakfile檔案和README.TXT檔案分別是make工具的配置檔案和NDK的說明檔案。
二、
進行android ndk開發需要經過如下的步驟一般
1、建立Application.mk檔案
2、建立Android工程
3、家裡Android.mk檔案
4、建立c原始碼檔案
5、編譯共享庫模組
6、執行Android程式。