[英]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 jlong
, jlong
變量和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.