Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android JNI配置及入門

Android JNI配置及入門

編輯:關於Android編程

JNI是一種可以在Java中調用C/C++代碼的技術,也就是說可以在Android上使用C/C++來開發。但是並不能用純C/C++來開發Android應用,因為這些C/C++代碼要通過Java定義的接口來調用。


我試驗Android上的JNI時使用的是NDK-R10,不需要Cygin,使用版本較低的NDK時請另尋教程。


NDK的安裝與ADT中如何配置NDK

可以到Android Developer官網上去下載最新的NDK工具包,下載下來之後解壓到隨便一個好找的目錄,比如我們解壓到了C:\,這樣NDK就被安裝在了C:\android-ndk-r10目錄中。


要在你的Android工程使用NDK還需要進行配置,配置的方法非常簡單:

在eclipse ADT中,點開Window->Preference->Andorid->NDK,然後在NDK Location中填入你安裝NDK的目錄,也就是上面的C:\android-ndk-r10。現在ADT就可以根據你提供的NDK路徑自動調用跟構建NDK項目相關的工具了。



試試第一個NDK程序

1. 首先在eclipse ADT中創建一個名為NDKTest的Android項目。

2. 在ADT中你要使用NDK的工程目錄上(這裡也就是NDKtest目錄),鼠標右鍵後選擇Android Tools->Add Native Support...

\

在彈出的對話框中填入你將要生成的二進制鏈接庫的文件名,這裡我們以hello.so為例

\

然後單擊finish,稍等一會兒,就會發現在你的工程目錄裡多了一叫jni的文件夾。

\


3. 現在就可以開始寫最終起作用那部分的C/C++代碼了,這些代碼都要寫在hello.cpp裡面(這個cpp文件的文件名和你剛才要創建的.so的鏈接庫的文件名一樣),我們在cpp中寫入如下代碼:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">#include #include // C/C++定義的方法必須為Java+包名+activity名+你的函數名,每個部分之間要用下劃線_來連接, // 而且參數也是固定的。所以定義C/C++函數的固定格式為: // Java_PackageName_ActivityName_function(JNIEnv* env, jobject obj) {...} // // 這裡extern "C"是為了防止C++編譯二進制鏈接庫時對函數進行改名,其實加不加都不影響這段實現代碼的運行效果, // 但是如果你的程序因為java.lang.UnsatisfiedLinkError: Native method not found這 // 錯誤而崩潰的話你還是加上吧。 extern "C" jstring Java_com_example_ndktest_MainActivity_hello(JNIEnv* env, jobject obj) { return env->NewStringUTF("hello JNI."); } 代碼中的注釋已經說明的非常明白了,你定義的C/ C++函數都要按照固定的格式來命名。

在你點擊run按鈕來運行你的app時ADT會自動調用ndk-build來編譯我們的C/C++代碼。

4. 要調用我們寫好的C/C++代碼,需要我們在Java源碼中加入如下代碼片:

public class MainActivity extends Activity {
	// 因為static塊比其他代碼都更優先加載,所以在這裡我們導入我們的動態鏈接庫
	// 記得之前讓你自己填寫的.so文件名吧,這裡你把文件名寫上就可以導入了
	static {
		System.loadLibrary("hello");
	}

	// 要使用自己定義的C/C++函數要像這樣在Java代碼中定義一個空方法
	// 返回值和你之前定義的C/C++函數返回的類型一樣,函數名和C/C++函數名
	// 最後那一部分就可以了,因為最後一部分才是函數名
	public native String hello();

	...
}

5. 這樣一來我們的C/C++代碼和Java調用接口都准備好了, 我們可以測試一下。

在MainActivity的xml布局代碼中加入如下代碼:


    
    

然後在Java代碼中加入如下部分:

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	((TextView) findViewById(R.id.display)).setText(hello());
}
運行後的效果:




如果轉載請注明出處:http://blog.csdn.net/gophers




  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved