在java与c构建多实例的案例中,java中对象保存一个long型成员变量,作为对应c实例的指针,jni层在新建c对象后,将对象指针(64位)转成长整型返回给java成员变量保存。然而在某些情况下,调用c实例的方法会出现ACCESS_VIOLATION
,并且在windows上会报错,但在linux上就没问题。经过排查,问题最终定位如下:
在jni.h
中,关于jlong
(java long)的typedef
并不是唯一的,在windows上,long总是32位(所以在linux上没问题),所以在jni层将地址转长整型的操作,必须要用__int64
(long
, long int
, long long
都不行)保存变量,并返回给java。
网友评论