java.nio.IntBuffer 的 jni NewDirectByteBuffer (NewDirectIntBuffer)

jni NewDirectByteBuffer for java.nio.IntBuffer (NewDirectIntBuffer)

如何为 java.nio.IntBuffer 创建 NewDirectByteBuffer?也就是如何使用 NewDirectIntBuffer ?

这工作正常:

    jclass canvasClass = env->GetObjectClass(obj);
    // in java:      public ByteBuffer command_ids_byte;
    fid_command_id = env->GetFieldID(canvasClass,"command_ids_byte","Ljava/nio/ByteBuffer;");

    jobject new_command_id_buffer = env->NewDirectByteBuffer(command_id.data(), command_id.size()*sizeof(int));
    env->SetObjectField(obj, fid_command_id, new_command_id_buffer);

虽然这不会(应用程序只是崩溃):

    jclass canvasClass = env->GetObjectClass(obj);
    // in java:      public IntBuffer command_ids;
    fid_command_id = env->GetFieldID(canvasClass,"command_ids","Ljava/nio/IntBuffer;");

    // I'd want to have NewDirectIntBuffer here
    jobject new_command_id_buffer = env->NewDirectByteBuffer(command_id.data(), command_id.size()*sizeof(int));
    env->SetObjectField(obj, fid_command_id, new_command_id_buffer);

您可以从 JNI 调用 Java asIntBuffer 方法到 return IntBuffer。为此,您需要获取 ByteBuffer class,查找 asIntBuffer 方法并调用它。

jclass canvasClass = env->GetObjectClass(obj);
// in java:      public IntBuffer command_ids;
fid_command_id = env->GetFieldID(canvasClass,"command_ids","Ljava/nio/IntBuffer;");

// create ByteBuffer
jobject new_command_id_byte_buffer = env->NewDirectByteBuffer(command_id.data(), command_id.size()*sizeof(int));

// get ByteBuffer class
jclass bbclass = env->GetObjectClass(new_command_id_byte_buffer);
// look up asIntBuffer method from ByteBuffer class:
jmethodID asIntBuffer = env->GetMethodID(bbclass, "asIntBuffer", "()Ljava/nio/IntBuffer;");

// convert to IntBuffer:
jobject new_command_id_buffer = env->CallObjectMethod(new_command_id_byte_buffer, asIntBuffer);

env->SetObjectField(obj, fid_command_id, new_command_id_buffer);
std::vector<jfloat> rect_x1;

// call with endian = ByteOrder.nativeOrder() from Java    
void flush(JNIEnv* env, jobject obj, jobject endian){
  jclass canvasClass = env->GetObjectClass(obj);

  jclass ByteBufferClass = env->FindClass("java/nio/ByteBuffer");
  jclass FloatBufferClass = env->FindClass("java/nio/FloatBuffer");
  jmethodID asFloatBuffer_methodID = env->GetMethodID(ByteBufferClass, "asFloatBuffer", "()Ljava/nio/FloatBuffer;");

  jmethodID order_methodID = env->GetMethodID(ByteBufferClass, "order", "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;");

      {
          jfieldID fid = env->GetFieldID(canvasClass, "drawRect_x1",
                                         "Ljava/nio/FloatBuffer;");
          jobject new_buffer = env->NewDirectByteBuffer(rect_x1.data(),
                                                        rect_x1.size() * sizeof(jfloat));
          env->CallObjectMethod(new_buffer, order_methodID, endian);
          jobject new_buffer_float = env->CallObjectMethod(new_buffer,
                                                           asFloatBuffer_methodID);
          env->SetObjectField(obj, fid, new_buffer_float);
        }
}