jlong (64 비트)을 포인터 (대개 32 비트 임)로 전달하면 반드시 데이터가 손실됩니다. 나는 컨벤션 무엇 모르겠지만, 하나이 시도 :
CallStaticVoidMethodA(myClass, "(J)V", (jvalue*)&val); //Note address-of!
나이 :
이
CallStaticVoidMethod(myClass, "(J)V", val);
그것은 jvalue 배열을 ...A
방법이다가, 노 후위 방법은 스칼라에 C 등가물을 Java 유형.
첫 번째 스 니펫은 다소 안전하지 않습니다. 더 나은, 경우 더 자세한 대안은 다음과 같습니다
이국적인 CPU의 archtectures에
jvalue jv;
jv.j = val;
CallStaticVoidMethodA(myClass, "(J)V", &jv);
, jlong
변수와 jvalue
노동 조합에 대한 정렬 요구 사항이 다를 수 있습니다. union을 명시 적으로 선언하면 컴파일러가이를 처리합니다.
또한 C++ long
데이터 유형은 종종 32 비트입니다. jlong은 64 비트이고, 32 비트 플랫폼에서 비표준 C 코드는 long long
또는 __int64
입니다.
'long! = jlong' 어쩌면? – quasiverse
JNI를 통해 "1"의 값을 전달하면 Java가 흥미롭게도 4294967297에 계속 보관됩니다. 그 숫자는 페르마 숫자입니다. 그건 우연히 우연의 일치로 보입니다. 이 특정한 가치가 왜 드러났는지에 대한 아이디어가 있다면 누구나 듣고 싶습니다. 화제로 돌아가서 Java/JNI가 정확한 값 1로 해석 할 수 있도록'(jlong) value '로 오랫동안 형변환했다. – StockB
4294967297은 (1 << 32) + 1 – samgak