JNI从DWord返回值

JNI Returning value from a DWord

本文关键字:返回值 DWord JNI      更新时间:2023-10-16

我在头文件

中有一个带有此签名的函数
SIMAPI_DECL DWORD WINAPI SimReadDwordBuffer (DWORD* pBuffer, 
                                             DWORD dwDwordsToRead, 
                                             DWORD* pdwDwordsRead, 
                                             DWORD dwBlockDwords, 
                                             DWORD dwNoWait);
With the following native call defined
protected native int  SimReadDwordBuffer (int[] pBuffer, 
                                          int dwDwordsToRead, 
                                          int pdwDwordsRead, 
                                          int dwBlockDwords, 
                                          int dwNoWait);

我使用java .exe创建jni头文件,它看起来像这样

protected native int  SimReadDwordBuffer (int[] pBuffer, 
                                          int dwDwordsToRead, 
                                          int pdwDwordsRead, 
                                          int dwBlockDwords, 
                                          int dwNoWait);

实现是这样的

JNIEXPORT jint JNICALL Java_com_sig_ccm_CcmBase_SimReadDwordBuffer
  (JNIEnv *env, jobject obj, jintArray pBuffer, jint dwWordsToRead, 
                             jint pdwWordsRead, 
                             jint dwBlockWords, jint dwNoWait){
jint *body = env->GetIntArrayElements(pBuffer, 0);
//DWORD foo = 0;
jint value = SimReadDwordBuffer((unsigned long int *)body,
                         dwWordsToRead,
                                     //&foo, 
                         (unsigned long int *)&pdwWordsRead,
                         dwBlockWords,
                         dwNoWait );
//cout << foo;
env->ReleaseIntArrayElements(pBuffer, body, 0);
return value;
}

问题是无论我尝试了什么,我都无法将值pdwWordsRead复制到我从java传递到jni的参数中。如果我使用一个局部变量,我可以把值写出来,这样c++函数就会把它传回来。如有任何建议,我将不胜感激。

Java通过值传递原语,而不是通过引用。此外,像jint的地址并将它们传递给population的函数也不是一个好主意。

JNIEXPORT jint JNICALL Java_com_sig_ccm_CcmBase_SimReadDwordBuffer
  (JNIEnv *env, jobject obj, jintArray pBuffer, jint dwWordsToRead, 
                             jint pdwWordsRead, 
                             jint dwBlockWords, jint dwNoWait){
jint *body = env->GetIntArrayElements(pBuffer, 0);
// I would consider copying the jint[] to a dword[] here... 
// I would also look into jlong instead of jint because jint 
// is 32-bit signed, and dword is 32-bit unsigned.  Then do 
// something like dword == jlong & 0xFFFFFFFF 
DWORD foo = 0;
jint value = SimReadDwordBuffer((DWORD *) body, // Potentially Bad!
                         (DWORD) dwWordsToRead,
                         &foo, 
                         //(DWORD *) &pdwWordsRead, Bad!
                         dwBlockWords,
                         dwNoWait );
// You need to return an object or something else to get both values out!!! 
env->ReleaseIntArrayElements(pBuffer, body, 0);
return value;
}

再次,我不知道什么值是,但如果它是一个成功的指标,检查它,并抛出一个异常,如果发生失败,并返回foo变量代替。