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新增路徑。