swig回掉java,使用Swig…将Java对象传递给C ++,然后返回Java

当使用Java,C ,Swig和Swig的导演时,我可以将继承C类的Java对象传递给C ++。这很好。

现在,当我将相同的Java对象从C 代码传递回Java时,Swig创建了一个 新的 Java对象来包装C指针。问题在于新对象与旧对象的类型不同。我继承了Java中的C ++类,并且需要该Java对象。

我为什么要这样做?我在Java中有一个资源池,C ++代码正在检出这些资源,然后将它们返回到池中。

以下是SSCE:

这是签出资源并返回资源的C ++代码:

// c_backend.cpp

#include "c_backend.h"

#include

void Server::doSomething( JobPool *jp ) {

printf("In doSomthing\n");

Person *person = jp->hireSomeone();

person->doSomeWorkForMe(3);

jp->returnToJobPool(person);

printf("exiting doSomthing\n");

}

这是覆盖C ++类的Java代码:

//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 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);

}

}

}

这是Swig接口文件:

//c_backend.i

%module(directors="1") c_backend

%{

#include "c_backend.h"

%}

%feature("director") Person;

%feature("director") JobPool;

%include "c_backend.h"

最后,是带有基本类的C ++头文件,然后是编译所有内容的Makefile:

// c_backend.h

#ifndef C_BACKEND_H

#define C_BACKEND_H

#include

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:

# 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

这是来自swig代码的一个片段,该片段创建了一个新的Java对象来替换我原来的Java对象:

public static void SwigDirector_JobPool_returnToJobPool(JobPool jself, long person) {

jself.returnToJobPool((person == 0) ? null : new Person(person, false));

}

如何在不依靠维护HashMap内部Java的情况下完成这项工作?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值