2013年1月5日 星期六

【Android】JNI(Java Native Interface)


JNI(Java Native Interface)指的是本機程式,一般是C或C++語言。

  • 作業系統上的驅動程式一般都使用C語言撰寫的
  • 某些大量處理的程式Java沒有C語言效率好
  • 有些C語言已經存在的模組不需要再用Java重寫

【Java訪問C】
在Java中定義一個native函數,如下

  • private native final void init()

C需要產生動態庫並安裝置Java程式中,對應函數如下

  • static void android_Manager_init(JNIEnv *env, jobject clazz)

第一個參數JNIEnv物件,指Java虛擬機器執行的環境
第二個參數jobject是使用該函數的物件,這裡指Manager

當Java使用native時,編譯器只傳送使用者的包名、函數名稱和參數類型
native引擎的AndroidRuntime類別提供一個registerNativeMethods()函數來產生Java native和C的關係

Java提供一個javah工具,讓你可以自動從Java檔自動產生對應的標頭檔
package com.marc.android.client;
public vlass Ex{
native void ex1();
}
產生一個標頭檔,如下
#include<jni.h>
#ifndef _Include_com_marc_android_client_Ex
#define _Include_com_marc_android_client_Ex
#ifdef __cplusplus
extern "C"{
#endif
JNIEXPORT void JNICALL Java_com_marc_android_client_ex1(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif

Java要訪問C的變數,C必須提供get或set類型的方法

參考來源:Android核心剖析

0 意見:

張貼留言