Android JNI配置及入門

來源:互聯網
上載者:User

標籤:android   jni   

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中寫入如下代碼:

#include <jni.h>#include <string.h>// 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布局代碼中加入如下代碼:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <!-- 用這個TextView來顯示咱們的結果 -->    <TextView         android:id="@+id/display"         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" /></RelativeLayout>
然後在Java代碼中加入如下部分:

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




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




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.