如何将c ++对象指针从c ++端传递给java端?长? ByteBuffer的?或其他

时间:2015-05-22 03:37:34

标签: java c++ java-native-interface long-integer bytebuffer

我正在编写一个需要使用JNI的程序,该程序包含以下步骤:

  1. 在c ++端创建一个对象

  2. 调用java方面做某事

  3. 取回在1

  4. 中创建的对象

    以下是传递给java的代码:

    长版:

    MyClass.java

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class MyClass */
    
    #ifndef _Included_MyClass
    #define _Included_MyClass
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     MyClass
     * Method:    init
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_MyClass_init
      (JNIEnv *, jclass);
    
    /*
     * Class:     MyClass
     * Method:    testCpp
     * Signature: (J)V
     */
    JNIEXPORT void JNICALL Java_MyClass_testCpp
      (JNIEnv *, jclass, jlong);
    
    #ifdef __cplusplus
    }
    #endif
    class MyClass{
    public:
        int myInt;
    };
    #endif
    

    MyClass.h

    #include "MyClass.h"
    JNIEXPORT void JNICALL Java_MyClass_init(JNIEnv *env, jclass clazz){
        MyClass* myClass=new MyClass();
        myClass->myInt=123;
        long myClass_pointer=(long)myClass;
        env->CallStaticVoidMethod(env->FindClass("MyClass"),env->GetStaticMethodID(env->FindClass("MyClass"),"testJava","(J)V"),myClass_pointer);
    }
    
    JNIEXPORT void JNICALL Java_MyClass_testCpp(JNIEnv * env,jclass clazz, jlong addr){
        MyClass* myClass=reinterpret_cast<MyClass*>(addr);
        printf("%d\n",myClass->myInt);
        delete myClass;
    }
    

    MyClass.cpp

    import java.nio.ByteBuffer;
    public class MyClass{
        static{
        System.loadLibrary("MyClass");
    }
        public static native void init();
    
        public static native void testCpp(ByteBuffer buf);
        public static void testJava(ByteBuffer buf){
            testCpp(buf);
        }
        public static void main(String[] args){
            init();
        }
    }
    

    但我也发现一些帖子可以先将对象指针转换为ByteBuffer,然后传递给java方:

    ByteBuffer版本:

    MyClass.java

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class MyClass */
    
    #ifndef _Included_MyClass
    #define _Included_MyClass
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     MyClass
     * Method:    init
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_MyClass_init
      (JNIEnv *, jclass);
    
    /*
     * Class:     MyClass
     * Method:    testCpp
     * Signature: (Ljava/nio/ByteBuffer;)V
     */
    JNIEXPORT void JNICALL Java_MyClass_testCpp
      (JNIEnv *, jclass, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    
    class MyClass{
    public:
        int myInt;
    };
    #endif
    

    MyClass.h

    #include "MyClass.h"
    JNIEXPORT void JNICALL Java_MyClass_init(JNIEnv *env, jclass clazz){
        MyClass* myClass;
        myClass->myInt=12345;
        jobject myClass_pointer=env->NewDirectByteBuffer(myClass,sizeof(myClass));
        env->CallStaticVoidMethod(env->FindClass("MyClass"),env->GetStaticMethodID(env->FindClass("MyClass"),"testJava","(Ljava/nio/ByteBuffer;)V"),myClass_pointer);
    }
    
    JNIEXPORT void JNICALL Java_MyClass_testCpp(JNIEnv * env,jclass clazz, jobject obj){
        MyClass* myClass=(MyClass*)env->GetDirectBufferAddress(obj);
        printf("%d\n",myClass->myInt);
        delete myClass;
    }
    

    MyClass.cpp

    {{1}}

    我搜索了一些关于如何将c ++指针传递给Java端的帖子,似乎很多帖子都提出了关于long或ByteBuffer的解决方案,但很少有人比较long和ByteBuffer。此外,我发现一些问题所有者使用很长时间,有时使用ByteBuffer。

    哪一个更好基于类型安全和跨平台?长? ByteBuffer的?或其他数据类型?或其他问题:何时使用long以及何时使用ByteBuffer?

0 个答案:

没有答案