簡體   English   中英

將C ++ long類型轉換為JNI jlong

[英]Casting a C++ long type to a JNI jlong

我正在使用JNI在C ++和Java之間傳遞數據。 我需要傳遞一個'long'類型,並且使用類似的東西:

 long myLongVal = 100;
 jlong val = (jlong)myLongVal;
 CallStaticVoidMethod(myClass, "(J)V", (jvalue*)val);

但是在Java中,當檢索到'long'參數時,它會被檢索為一些非常大的負數。 我究竟做錯了什么?

當您將jlong​​(64位)作為指針(很可能是32位)傳遞時,您必然會丟失數據。 我不確定這是什么慣例,但試試這個:

CallStaticVoidMethodA(myClass, "(J)V", (jvalue*)&val); //Note address-of!

或這個:

CallStaticVoidMethod(myClass, "(J)V", val); 

它是...A采用jvalue數組的方法,no-postfix方法將C等價物轉換為標量Java類型。

第一個片段有些不安全; 一個更好的,如果更詳細的替代方案將是:

jvalue jv;
jv.j = val;
CallStaticVoidMethodA(myClass, "(J)V", &jv);

在一些奇特的CPU jlongjlong變量和jvalue聯合的對齊要求可能不同。 當您明確聲明聯合時,編譯器會處理它。

另請注意,C ++ long數據類型通常為32位。 jlong​​是64位,在32位平台上非標准C等價物是long long__int64

CallStaticVoidMethod(myClass, "(J)V", (jvalue*)val);

這是未定義的行為。 您正在轉換整數作為指針。 它不是指針。 您至少需要傳遞地址 這段代碼會在大多數平台上立即崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM