Когда вы передаете jlong (который является 64-битным) в качестве указателя (который, скорее всего, 32-битный), вы обязательно потеряете данные. Я не уверен, что такое соглашение, но попробуйте либо это:
CallStaticVoidMethodA(myClass, "(J)V", (jvalue*)&val); //Note address-of!
или это:
CallStaticVoidMethod(myClass, "(J)V", val);
Это ...A
методы, которые принимают массив jvalue, методы без постфикса принимают эквиваленты C для скалярных типов Java.
Первый фрагмент кода несколько небезопасен; лучше, если более многословно, альтернатива будет:
jvalue jv;
jv.j = val;
CallStaticVoidMethodA(myClass, "(J)V", &jv);
В некоторых экзотических архитектурах ЦП требования к выравниванию переменных jlong
и объединений jvalue
могут отличаться. Когда вы объявляете объединение явно, об этом позаботится компилятор.
Также обратите внимание, что тип данных C ++ long
часто является 32-разрядным. jlong - 64 бита, на 32-битных платформах нестандартный эквивалент C равен long long
или __int64
.