1. 程式人生 > >Android NDK開發 Android JNI專案建立

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>JNIEXPORTJNICALL都是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程式。