我是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")
吗?
答案 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());
}}