我找到了一个可能的解决方案(在此处链接),可以使用jlong或jobject作为在JNI端创建的对象的句柄(或指针,如果您愿意的话)。
人们说最好使用Jobject作为ByteBuffer而不是jlong以获得更好的兼容性。
解决方案是:
Java方面:
private native ByteBuffer init();private native void foo(ByteBuffer handle);
JNI端:
class FieldsHolder { ... //private fields, for each instance }创建JNI对象并发送到Java端:
JNIEXPORT jobject JNICALL ...init(JNIEnv * env, jobject obj) { FieldsHolder* myClass= new FieldsHolder(); ... //prepare fields of the class return env->NewDirectByteBuffer(myClass, 0); }重用JNI对象:
JNIEXPORT void JNICALL ...foo(JNIEnv * env, jobject obj, jobject handle) { FieldsHolder* myClass= (FieldsHolder*) env->GetDirectBufferAddress(handle); //now we can access the fields again. }


