當使用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