Ответ 1
Когда вы передаете 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);
В некоторых экзотических архитектурах процессора требования к выравниванию для переменных jlong
и jvalue
могут быть разными. Когда вы объявляете союз явно, компилятор позаботится об этом.
Также обратите внимание, что тип данных С++ long
часто является 32-битным. jlong - 64 бита, на 32-битных платформах нестандартный эквивалент C равен long long
или __int64
.