2014-08-29 60 views
0

儘可能快地創建Jni的最佳方式是什麼?通過JNI運行時間

我需要調用一個.dll與cxternal測量框進行對話。 Atm我確實使用一個靜態加載的Lib來調用JNI中Box的值。

 public class myJni{ 

     static { 
      System.loadLibrary("myJniDll"); 
     } 
     public native double  Get4(String para); 
    } 

很簡單,你可以看到。

在C面使用:

HINSTANCE hInstLibrary = LoadLibrary("my_64.dll"); 
typedef void(*FunctionFunc)(); 

JNIEXPORT jdouble JNICALL my_Get4 
(JNIEnv * penv, jclass clazz, jstring Para) 
{ 
    typedef double(__stdcall *Get4)(char FAR *lpszPara); 

    Get4 _Get4; 
    FunctionFunc _FunctionFunc2; 

    _Get4 = (Get4)GetProcAddress(hInstLibrary, "my_Get4"); 
    _FunctionFunc2 = (FunctionFunc)GetProcAddress(hInstLibrary, "Function"); 

    const char *nativeString = penv->GetStringUTFChars(Para, 0); 

    const char* parameter = nativeString; 

    double ret = _Get4((char*)parameter); 

    penv->ReleaseStringUTFChars(Para, nativeString); 

    return ret; 


} 

代碼需要約20毫秒得到的COM Portunit的價值。價值變化時的滯後並不「感覺」好。當我改變需要時間去超越Jni的價值時是明智的。

有人得到一些tweeks得到它約10毫秒?

@編輯:吉爾指針跳過產生了巨大的影響。它現在不那麼「緩慢」。仍然沒有我想要的,但確定。

Com端口上的Unit是一個以0.000000的精度工作的Measurement設備。所以滯後由最後4個數字顯示並不平穩改變,但在改變時跳過大部分比例。

+0

因此,靜態鏈接會產生更大的影響。你試過了嗎? – EJP 2014-08-29 10:21:12

+0

對不起@ EJP第一次計時器在這裏。不,我不會嘗試到目前爲止,這是下一次我嘗試一旦我回到車站。 – Fulli 2014-08-29 11:10:49

+0

@EJP,我只是用靜態的lib加載運行。它與指針跳過有相同的影響,但是當我同時做這兩件事時,差別是一樣的。非常奇怪...... – Fulli 2014-09-01 07:09:31

回答

1

您可以跳過加載函數指針,每個呼叫:

static Get4 _Get4 = NULL; 
static FunctionFunc _FunctionFunc2 = NULL; 

if(!_Get4) 
    _Get4 = (Get4)GetProcAddress(hInstLibrary, "my_Get4"); 

if(!_FunctionFunc2) 
_FunctionFunc2 = (FunctionFunc)GetProcAddress(hInstLibrary, "Function"); 

這將節省的時間OT。

+0

@Fulli我們是否真的明白,這個答案本身就能讓你加速尋找? – EJP 2014-08-29 10:19:19

+0

@ EJP:如上所述 - 第一個計時器。我認爲幫助的答案應該是Aceptet答案。到目前爲止,他的答案幫助最大。 – Fulli 2014-08-29 11:11:51

0

您不會說明哪些方法會做類似'獲取Com Portunit的值'的任何東西,但每次調用此方法時不需要獲取本地函數地址。他們不會改變。第一次將它們粘貼到靜態變量中。事實上,你根本不需要動態加載'my_64.dll'。靜態鏈接到它。

1

其他答案提供了一些有用的優化(孤立查看),但我很悲觀,他們會給你你想要的加速量。

如果這個方法真的需要每次通話20毫秒,攤銷呼叫的數量,那麼我可以自信地預測,當時的絕大多數花費無論是在調用Get4,或在調用GetStringUTFChars 。這些都不能優化,所以獲得50%加速的可能性是(IMO)不存在的。

+0

我完全同意。 – EJP 2014-08-29 10:17:44