【譯文】JNI編程

原文連接: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html  

沒有逐字翻譯,解說了文章的大體意思,須要瞭解細節的請看原文~html

1. 介紹: 

  有時候咱們須要Native code(c/c++)來克服Java中的內存管理和性能約束。 Java經過JVM提供的JNI功能達到了這個目的。JNI涉及到兩種語言和運行時環境,因此比較難點。這裏我假設你對Java,c/c++,相關IDE比較熟悉。java

 

2. 開始

2.1   在Java中使用C: c++

  1. 在Java類中聲明相應的方法爲native方法
  2. 使用javah工具生成相應的頭文件
  3. 編寫對應的c源文件(包含對應的頭文件,實現裏面聲明的函數)
  4. 編寫Makefile
  5. 運行包含main方法的Java類(注意設置java.library.path變量)

2.2  在Java中混合c/c++數組

  主要問題是,要明白如何在c源文件中調用c++函數(函數聲明的時候要注意使用extern 「C")app

2.3   JNI相關的包問題ide

  若是包含native方法的類不是在默認包裏,就涉及到這個問題,在使用javah的時候須要注意切換到package base directory。函數

 

2.4  JNI在Eclipse中的使用  工具

   

3. JNI基礎

  1.  Java的原始類型:JNI 中的類型和對應的Java中的類型 
    jint jbyte jshort jlong jfloat jdouble jchar jboolean 
    int   byte  short  long  float  double  char  boolean
  2. Java的引用類型(reference type): jobject 對應 java.lang.Object
    1. jclass 對應 java.lang.Class
    2. jstring 對應java.lang.String
    3. jthrowable 對應java.lang.Throwable
    4. jarray表示Java的數組
  3.  native函數接收Java程序傳入的參數,而後轉換爲本地類型,計算完畢後,把本地結果拷貝到JNItype類型的對象中,而後返回

4. 參數和結果傳遞

4.1  傳遞原始類型(primitives)性能

4.2  傳遞字符串spa

// UTF-8 String (encoded to 1-3 byte, backward compatible with 7-bit ASCII)
// Can be mapped to null-terminated char-array C-string
const char * GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy);
   // 返回jstring對象中的內部c字符串
void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf);
   // 告訴虛擬機native code再也不須要訪問jstring的utf
jstring NewStringUTF(JNIEnv *env, const char *bytes);
   //新建立一個java.lang.String 對象
jsize GetStringUTFLength(JNIEnv *env, jstring string);
   // Returns the length in bytes of the modified UTF-8 representation of a string.
void GetStringUTFRegion(JNIEnv *env, jstring str, jsize start, jsize length, char *buf);
   // Translates len number of Unicode characters beginning at offset start into modified UTF-8 encoding 
   // and place the result in the given buffer buf
View Code

4.3  傳遞原始類型的數組

5. 訪問對象

(如何在native code中修改Java對象的值)

 5.1  實例變量

 5.2  類的靜態變量

 5.3  方法調用

 5.4 調用overridden的方法

 6. 建立對象和對象數組

 

 7. Local和Global 引用  

 1 classInteger = (*env)->FindClass(env, "java/lang/Integer");  //這裏得到是Local 引用,即便保存的全局變量裏,下次也不能使用,因此須要從新申請,或者像下面這樣:
 2 
 3    // Get a class reference for java.lang.Integer if missing
 4    if (NULL == classInteger) {
 5       printf("Find java.lang.Integer\n");
 6       // FindClass returns a local reference
 7       jclass classIntegerLocal = (*env)->FindClass(env, "java/lang/Integer");
 8       // Create a global reference from the local reference
 9       classInteger = (*env)->NewGlobalRef(env, classIntegerLocal);
10       // No longer need the local reference, free it!
11       (*env)->DeleteLocalRef(env, classIntegerLocal);
12    }

 

原文連接: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html 

相關文章
相關標籤/搜索