std :: map <std :: string,std :: string>转换JavaCPP

时间:2017-12-13 02:38:03

标签: javacpp

我是JavaCPP的新手,现在我遇到了问题。

我的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"));
    }
} 

何时

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

jniTestLibrary.cpp:2238:30:错误:调用非静态成员       没有对象参数的函数         rptr =&amp; :: TestClass :: getMap(ptr0);
                ~~~~~~~~~~~~~ ^ ~~~~~

上面的代码是从NativeLibrary示例修改的。但是如何解决编译问题呢? 我可以这样使用m.get("a")吗?

1 个答案:

答案 0 :(得分:1)

我设法改变了......

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());
}}