沒有逐字翻譯,解說了文章的大體意思,須要瞭解細節的請看原文~html
有時候咱們須要Native code(c/c++)來克服Java中的內存管理和性能約束。 Java經過JVM提供的JNI功能達到了這個目的。JNI涉及到兩種語言和運行時環境,因此比較難點。這裏我假設你對Java,c/c++,相關IDE比較熟悉。java
2.1 在Java中使用C: c++
2.2 在Java中混合c/c++數組
主要問題是,要明白如何在c源文件中調用c++函數(函數聲明的時候要注意使用extern 「C")app
2.3 JNI相關的包問題ide
若是包含native方法的類不是在默認包裏,就涉及到這個問題,在使用javah的時候須要注意切換到package base directory。函數
2.4 JNI在Eclipse中的使用 工具
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
4.3 傳遞原始類型的數組
(如何在native code中修改Java對象的值)
5.1 實例變量
5.2 類的靜態變量
5.3 方法調用
5.4 調用overridden的方法
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