2012-10-12 105 views
2

這裏是C++代碼的摘錄是從Java的JVM通過JNI調用:JVM崩潰的JNI調用ReleaseStringUTFChars,僅適用於Windows 7,Windows XP的罰款

(JNIEnv *pJniEnv, jobject, jstring pDllName) 
    { 
      string dllName(pJniEnv->GetStringUTFChars(pDllName, NULL)); 

      // stuff happens here like 
      HINSTANCE loadedDll = LoadLibrary(dllName.c_str()); 

      pJniEnv->ReleaseStringUTFChars(pDllName, dllName.c_str()); 

      return ...; 
    } 

此工程在Windows XP,但崩潰在Windows 7與訪問衝突異常,在該行

pJniEnv->ReleaseStringUTFChars(pDllName, dllName.c_str()); 

的錯誤信息是:

在0x77355F29第一次機會異常(ntdll.dll):0xC0000005:訪問衝突讀取位置0x002B0D52。

我會很感激任何線索。

JRE版本:6.0_27-B07,Java虛擬機:Java的熱點(TM)客戶端VM(20.2-B06混合模式Windows-X86),C++代碼是用Visual Studio 2010中

回答

7

GetStringUTFChars()文檔建狀態:

返回一個指向字符串的UTF-8字符數組的指針。 該陣列在ReleaseStringUTFChars發佈之前一直有效。

ReleaseStringUTFChars()狀態的文檔(其中string是第一個參數和utf是第二個參數):

時通知虛擬機執行該本地代碼沒有 不再需要訪問本地字符串UTF 。 utf參數 是使用GetStringUTFChars從字符串派生的指針。

在投稿代碼,dllName.c_str()被作爲第二個參數傳遞給ReleaseStringUTFChars()c_str()dllName擁有這是不正確的(std::string的構造使得複製其參數的),並且不從pDllName dervied 。這個事實在一個平臺而不是另一個平臺上表明瞭未定義的行爲。

要糾正:

const jbyte* pDllName_string = pJniEnv->GetStringUTFChars(pDllName, NULL); 
std::string dllName(pDllName_string); 
pJniEnv->ReleaseStringUTFChars(pDllName, pDllName_string); 

/* Use 'dllName' */ 
+0

謝謝,這是偉大的!我會接受你的回答,並在稍後報告,如果它已經工作(可能需要一段時間來嘗試)。 –

+0

似乎GetStringUTFChars不會返回一個jbyte *而是一個char * ... –

+0

@TimvanBeek這是一個沒有區別的區別。他們是一樣的東西。 – EJP