javajni,javajnic 找不到指定的模塊

本文目錄一覽:

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-19 13:20
下一篇 2024-12-19 13:20

相關推薦

發表回復

登錄後才能評論