当使用Java,C++,痛饮,并痛饮的董事,我可以通过继承一个C++类C++的Java对象。这很好。传递Java对象到C++使用痛饮......然后回Java
现在,当我传递相同的Java从C++代码对象回Java,痛饮创建一个新 Java对象来包裹C++指针。问题在于新对象与旧对象的类型不同。我继承了Java中的C++类,并且需要返回该Java对象。
为什么我要这么做?我有一个Java资源池,C++代码正在检查这些资源,然后将它们返回到池中。
以下是对SSCE:
下面是检查出来的资源,并返回它的C++代码:
// c_backend.cpp
#include "c_backend.h"
#include <stdio.h>
void Server::doSomething(JobPool *jp) {
printf("In doSomthing\n");
Person *person = jp->hireSomeone();
person->doSomeWorkForMe(3);
jp->returnToJobPool(person);
printf("exiting doSomthing\n");
}
这里的Java代码覆盖C++类:
//JavaFrontend.java
import java.util.List;
import java.util.ArrayList;
public class JavaFrontend {
static {
System.loadLibrary("CBackend");
}
public static void main(String[] args) {
JobPool jobPool = new JobPoolImpl();
new Server().doSomething(jobPool);
}
public static class JobPoolImpl extends JobPool {
private List<PersonImpl> people = new ArrayList<>();
public Person hireSomeone() {
if (people.size() > 0) {
Person person = people.get(0);
people.remove(person);
return person;
} else {
System.out.println("returning new PersonImpl");
return new PersonImpl();
}
}
public void returnToJobPool(Person person) {
people.add((PersonImpl)person);
}
}
public static class PersonImpl extends Person {
public void doSomeWorkForMe(int i) {
System.out.println("Java working for me: "+i);
}
}
}
这里的痛饮接口文件:
//c_backend.i
%module(directors="1") c_backend
%{
#include "c_backend.h"
%}
%feature("director") Person;
%feature("director") JobPool;
%include "c_backend.h"
最后,与基类,然后生成文件的C++头文件,编译这一切:
// c_backend.h
#ifndef C_BACKEND_H
#define C_BACKEND_H
#include <stdio.h>
class Person {
public:
virtual ~Person() {}
virtual void doSomeWorkForMe(int i) {
printf("in C++ doSomeWorkForMe %i\n",i);
}
};
class JobPool {
public:
virtual ~JobPool() {}
virtual Person *hireSomeone() {
printf("in C++ hireSomeone\n");
return NULL;
}
virtual void returnToJobPool(Person *person) {
printf("in C++ returnToJobPool\n");
}
};
class Server {
public:
void doSomething(JobPool *);
};
#endif
的生成文件:
# Makefile
JAVA_INCLUDE=-I/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/include/darwin
all:
c++ -c c_backend.cpp
swig -java -c++ $(JAVA_INCLUDE) c_backend.i
c++ $(JAVA_INCLUDE) -c c_backend_wrap.cxx
c++ -dynamiclib -o libCBackend.jnilib *.o -framework JavaVM
javac *.java
clean:
rm -rf *.class *.o *_wrap.cxx *_wrap.h Server.java SWIGTYPE*.java c_backend*.java JobPool.java Person.java
下面是从用于创建所述痛饮一个代码段新的Java对象替换我原来的Java对象:
public static void SwigDirector_JobPool_returnToJobPool(JobPool jself, long person) {
jself.returnToJobPool((person == 0) ? null : new Person(person, false));
}
我怎样才能使这项工作不依赖于保持HashMap
里面的Java?
我想我在这里回答基本上相同的问题:http://stackoverflow.com/questions/9817516/swig-java-retaining-class-information-of-the-objects-bouncing-from-c - 这样做帮帮我?如果不是的话,我可以写出一些说明任何差异的东西。 – Flexo
事实上,这是同样的问题,解决方案将适用于我的问题。虽然我不喜欢答案(即使它有效)。我希望Swig直接支持的东西......事实上......我希望Swig在创建director实例时将存储Java对象,并在C++对象传递给Java时检测并检索它。这是可能的,而且很简单。没有散列。 但是,唉,目前似乎有必要。 – Jason
[SWIG Java保留从C++弹出的对象的类信息]的重复(http://stackoverflow.com/questions/9817516/swig-java-retaining-class-information-of-the-objects-bouncing-from- c) – Jason