Swig typemap java object

前端 未结 2 1728
故里飘歌
故里飘歌 2021-01-24 12:17

I am trying to generate java bindings through swig for these two c++ functions

C++ functions

void SetUserData(void* data);
void* GetUserData() const;
         


        
2条回答
  •  难免孤独
    2021-01-24 13:02

    For completeness, here's another (simpler?) way to do it with JavaCPP. Assuming we have a GlobalData.h file like this in C++:

    class Data {
    public:
        JNIEnv* env;
        jobject data;
    
        Data(JNIEnv* env, jobject obj) : env(env), data(NULL) { }
        ~Data() { if (data != NULL) env->DeleteGlobalRef(data); }
    
        void SetUserData(jobject obj) { 
            if (data != NULL) env->DeleteGlobalRef(data);
            data = env->NewGlobalRef(obj);
        }
        jobject GetUserData() { return data; }
    };
    

    We can use it from Java this way:

    import org.bytedeco.javacpp.*;
    import org.bytedeco.javacpp.annotation.*;
    
    @Platform(include="GlobalData.h")
    public class GlobalData {
        static { Loader.load(); }
    
        public static class Data extends Pointer {
            public Data() { allocate(); }
            private native @Raw(withEnv=true) void allocate();
    
            public native void SetUserData(@Raw Object obj);
            public native @Raw Object GetUserData();
        }
    
        public static void main(String[] args) {
            Object someObject = new Object();
            Data myData = new Data();
            myData.SetUserData(someObject);
            Object sameObject = myData.GetUserData();
    
            System.out.println(someObject);
            System.out.println(sameObject);
        }
    }
    

    Where the output shows that someObject and sameObject point to the same object, for example:

    java.lang.Object@7aa06577
    java.lang.Object@7aa06577
    

提交回复
热议问题