1. 程式人生 > >Android Native開發(一)JNI

Android Native開發(一)JNI

JNI 是 Java Native Interface 的縮寫,即JAVA本地介面。

JNI 是 Java 的一部分,不是Android引入的。

首先介紹JNI在 JAVA 下的示例,再介紹如何在Android下使用。

eclipse建立Java Application工程——TestJNI

(1)  Java類中編寫native宣告的方法:TestJNI.java ,位於工程的com.wps.jni包下:

package com.wps.jni;

public class TestJNI {
	
	public native String getText(String name);
	
	static
	{
		System.loadLibrary("testjni");
	}

}

(2) javah 生成相應的JNI樣式的c/c++標頭檔案:

      java檔案被編譯後放到bin目錄下,如本例: <工程目錄>/bin/com/wps/jni/TestJNI.class

      (若沒自動生成class檔案,需要javac編譯,並放到上面目錄中,eclipse下會自動編譯。)

      進入<工程目錄>/bin,執行javah -classpath  .  -jni com.wps.jni.TestJNI   (包名必須一致)

      會生成com_wps_jni_TestJNI.h。其內容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_wps_jni_TestJNI */

#ifndef _Included_com_wps_jni_TestJNI
#define _Included_com_wps_jni_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_wps_jni_TestJNI
 * Method:    getText
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_wps_jni_TestJNI_getText
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

(3) 編寫c++程式碼實現上面函式 。 com_wps_jni_TestJNI.cpp。 內容如下:
#include <jni.h>
#include "com_wps_jni_TestJNI.h"

jstring JNICALL Java_com_wps_jni_TestJNI_getText
                (JNIEnv *env, jobject obj, jstring name)
{
    char s[80];
    const char* str = env->GetStringUTFChars( name, NULL );
    sprintf( s, "hello,%s!", str );
    env->ReleaseStringUTFChars( name, str );
    jstring r_str = env->NewStringUTF( s );
    return r_str;
}

(4) 編譯生成動態連結庫(linux下.so)

      g++ com_wps_jni_TestJNI.cpp -I /usr/local/jvm/jdk1.8/include -I /usr/local/jvm/jdk1.8/include/linux -fPIC -shared -o libtestjni.so

(5) 編寫main函式測試:


        TestJNI jnir = new TestJNI();
        System.out.println(jnir.getText("world"));

注意:eclipse下如果想使用System.loadLibrary("testjni")來載入的話,需要在eclipse的build path下Libraries的Native library新增路徑。