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

Android JNI 入門

編輯:關於Android編程

Android JNI (Java Native Interface)就是為了實現java 與其他語言相互調用的語言。當然在Android就是為了跟C,C++的調用。在Linux ,Mac中Java最後調用的就是.so的文件,在Window中就是.dll文件。

那麼Java到C怎麼對應起來?調用Java的哪個方法就是C中的哪個方法呢?通過在Java類中聲明native的方法就開始了。

新建一個Android工程HelloNDK。新建一個類GetString

 

public class GetString {
	public static native String GetString();
	public static native String GetString(int a,int b);
	public static native String getWord();
}
具體的步驟如下:

 

1、在Java中聲明native()方法,然後編譯(javac);

2、用javah產生一個.h文件;

3、編寫包含.h文件的c文件

4、編譯c文件

5、使用編譯成功的so文件。

在我建立Android Project中是怎麼實現的?其實在工程的bin/classes/目錄下(classes是隱藏的)就第一步就編譯好了,所以我們在這目錄下進行第二步,命令為:

javah -jni com.example.hellondk.GetString(包+類)

就會生成com.example.hellondk.GetString.h 頭文件,只要你NDK目錄配置好了,接下來就是右鍵工程在Android Tool中選Add Native Support 看到工程名點finish。

接下來就在工程下看到多了jni這個文件夾。裡面有Android.mk,還有同工程名的.cpp文件。

把剛才生成的.h文件拷貝到jni文件夾下。

編寫c文件呢先要看下.h頭文件裡面寫的是什麼

 

* Class:     com_example_hellondk_GetString
 * Method:    GetString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__
  (JNIEnv *, jclass);

/*
 * Class:     com_example_hellondk_GetString
 * Method:    GetString
 * Signature: (II)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__II
  (JNIEnv *, jclass, jint, jint);

/*
 * Class:     com_example_hellondk_GetString
 * Method:    getWord
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_getWord
  (JNIEnv *, jclass);

方法名稱很嚇人,不過看下就知道Java跟C的方法就這樣對應起來了。JNIEnv等其他參數以後再講

 

接下來是實現在.cpp文件中實現這些方法。復制過去

 

#include "com_example_hellondk_GetString.h"

/*
 * Class:     com_example_hellondk_GetString
 * Method:    GetString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__
  (JNIEnv * env, jclass){
	return env->NewStringUTF("hello ndk");
};

/*
 * Class:     com_example_hellondk_GetString
 * Method:    GetString
 * Signature: (II)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__II
  (JNIEnv * env, jclass, jint a, jint b){
	return env->NewStringUTF("result a+b="+(a+b));
};

JNIEXPORT jint JNICALL Java_com_example_hellondk_GetInt_getInt
  (JNIEnv * env, jclass, jint a){
	return a;
};

簡單的返回輸出。

 

那現在怎麼使用呢?其實我們還可以看到在工程的libs目錄下生成了armeabi文件夾下生成了libHelloNDK.so庫文件。這個就是我們要使用的.so庫文件啦

在MainActivity中

 

static {
		System.loadLibrary("HelloNDK");
	}

就可以了。接下就可以直接用GetString的方法,這樣就實現了Java-->C了。

 

 

 

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