本文目錄一覽:
- 1、Java層與Jni層數據傳遞的幾種方式
- 2、用Java的JNI技術技術調用C++,C++運行效率會不會比單獨運行時慢?
- 3、如何為Android,Mac和Windows平台創建Java JNI動態鏈接庫
- 4、Java通過JNI調用C 傳遞參數時,想傳遞地址,怎麼實現
- 5、Java開發中什麼情況下要用到JNI技術
Java層與Jni層數據傳遞的幾種方式
一、 從Java傳遞數組到Jni層
二、 從Jni層傳遞數組到Java層
三、 Direct Buffer 方式傳遞
用Java的JNI技術技術調用C++,C++運行效率會不會比單獨運行時慢?
這要取決於在方法中執行的語句,如果只是作一些簡的操作,調用C/C++代碼反而會拉低效率,如果是比較複雜的一些運算如圖像處理變換等,C/C++代碼效率更高。
java中引入jni技術的原由是由於java的運行效率較低,當遇到處理圖像聲音等需要大量運算的操作時,java力不從心。所以引入執行效率較高的C/C++代碼供java調用,以彌補java的這一缺陷。
jni雖然一定程度上能夠提高效率,但要慎用,適當用。如果只作簡單的加法,卻用jni效率反而大大降低。並且jni會影響java的跨平台性和穩定性。
如何為Android,Mac和Windows平台創建Java JNI動態鏈接庫
Android1、下載NDK,並在Eclipse中配置路徑:
2、創建一個Android工程hellojni。右鍵工程,選擇Add Native Support自動生成C/C++工程:
3、修改C/C++代碼,配置一下Android.mk:
4、點擊保存就會自動生成動態鏈接庫libhellojni.so。也可以通過命令ndk-build手動生成。
Windows
1、打開Visual Studio,創建一個Win32工程hellojni:
2、在應用類型中選擇DLL:
3、配置頭文件和庫的路徑:
4、點擊build就可以生成hellojni.dll。
Mac OS X
1、打開Xcode,創建一個工程hellojni :
2、framework選擇STL:
3、在build設置里,配置JavaVM 頭文件路徑和庫路徑:
4、點擊build就可以生成libhellojni.dylib。
Java工程中如何使用JNI:
1、申明native接口:
public native String stringFromJNI();
public native static void nativePrint();
2、加載動態鏈接庫:
static {
System.loadLibrary(“hellojni”);
}
Java通過JNI調用C 傳遞參數時,想傳遞地址,怎麼實現
java數組傳遞給jni實際是指針,只是java禁止你直接在jni里對java數組操作,所以在jni需要對java數組轉換為jni里可以操作的數組。典型的還有字符串,c struct等。
之所以禁止jni直接操作數組可能是jvm在安全等方面的考慮。jni調用涉及到java內存棧和native內存棧。jvm只能處理到java內存,沒有實現自動管理jni調用的內存。試想下如果jni里操作java數組剛好被回收了會怎樣?
所以在jni里需要拷貝java數組副本,而且分配或者是引用了對象,需要手動釋放刪除(DeleteLocalRef、ReleaseXX)。jni調用實際是個很大的開銷.
Java開發中什麼情況下要用到JNI技術
JNI可以使Java代碼和本地的C/C++代碼進行交互。
為什麼要使用JNI技術:
java無法直接操作硬件, c/c++可以操作硬件,並且效率較高。
java在視頻處理,遊戲渲染等方面效率不及c/c++。
避免重複造輪子, 有大量優秀的庫,可以復用。
例如:java圖形界面程序在最小化後,無法獲取全局的鍵盤和鼠標事件. 需要JNI實現全局熱鍵功能 . java里獲取其他窗口的句柄, 並對其他窗口進行控制,也需要JNI技術.
使用了JNI技術缺點是會導致無法跨平台。 需要根據其他平台,再開發本地代碼。
JNI實現起來有點複雜. 所以有了JNA技術, 雖然JNA很強大,但是很多功能還是需要JNI來實現的
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/277013.html