Search code examples
javacpp

std::map<std::string,std::string> conversion of JavaCPP


I'm a newbie of JavaCPP, right now I've got a problem.

my TestLibrary.h:

#include <string>
#include <map>


    class TestClass {
        public:
            TestClass() {
                property["a"]="b";
            }
            const std::map<std::string,std::string>& getMap(std::string str) { 
                if (str == "a"){
                    return property; 
                }
            }
            std::map<std::string,std::string> property;
    };

TestLibrary.java

import org.bytedeco.javacpp.*;
import org.bytedeco.javacpp.annotation.*;

@Platform(include="TestLibrary.h")
public class TestLibrary { 
    public static class TestClass extends Pointer {
        static { Loader.load(); }
        public TestClass() { allocate(); }
        private native void allocate();

        public static native @ByRef KeyValueMap getMap(String str);    
    }

@Name("std::map<std::string,std::string>") public static class 
KeyValueMap extends Pointer { 
     static { Loader.load(); } 
     public KeyValueMap(Pointer p) { super(p); } 
     public KeyValueMap()       { allocate();  } 
     private native void allocate(); 

     public native long size(); 

     @Index public native @StdString BytePointer get(@StdString 
BytePointer i); 
     public native KeyValueMap put(@StdString BytePointer i, BytePointer 
value); 
} 

    public static void main(String[] args) {
        TestClass l = new TestClass();
        KeyValueMap m = l.getMap("a");
        System.out.println(m);
        //System.out.println(m.get("a"));
    }
} 

when

javac -cp javacpp.jar TestLibrary.java
java -jar javacpp.jar TestLibrary

jniTestLibrary.cpp:2238:30: error: call to non-static member function without an object argument rptr = &::TestClass::getMap(ptr0);
~~~~~~~~~~~~~^~~~~~

the code above is modified from the NativeLibrary example. But How to solve the compile problem? And can I use m.get("a") like that?


Solution

  • I managed to do this by changing...

    TestLibrary.h:

    #include <string>
    #include <map>
    
    
    class TestClass {
        public:
            TestClass() {
                property["a"]="b";
            }
            std::map<std::string,std::string>& getMap(std::string str) { 
                if (str == "a"){
                    return property; 
                }
            }
            std::map<std::string,std::string> property;
    };
    

    TestLibrary.java

    import org.bytedeco.javacpp.*;
    import org.bytedeco.javacpp.annotation.*;
    
    @Platform(include="TestLibrary.h")
    public class TestLibrary { 
        public static class TestClass extends Pointer {
        static { Loader.load(); }
        public TestClass() { allocate(); }
        private native void allocate();
    
        public native @ByRef KeyValueMap getMap(String str);    
    }
    
    @Name("std::map<std::string,std::string>") 
    public static class KeyValueMap extends Pointer { 
     static { Loader.load(); } 
     public KeyValueMap(Pointer p) { super(p); } 
     public KeyValueMap()       { allocate();  } 
     private native void allocate(); 
    
     public native long size(); 
    
     @Index public native @StdString BytePointer get(@StdString BytePointer i); 
     public native KeyValueMap put(@StdString BytePointer i, BytePointer value); } 
    
    public static void main(String[] args) {
        TestClass l = new TestClass();
        KeyValueMap m = l.getMap("a");
        System.out.println(m.size());
        System.out.println(m.get(new BytePointer("a")).getString());
    }}