У меня есть класс C++ с виртуальным методом. Я использую режиссеры, и я подклассифицировал класс C++ на Java. Этот класс предназначен для приема обратных вызовов из кода C++. Таким образом, класс Java затем передается методам на C++ и C++ (upcalls to Java). Есть аргументы массива (или массивы указателей, я пробовал оба), и они преобразуются в SWIGTYPE_p_double.Передача массивов из C++ в Java с использованием команд Swig, вызов up
Я хотел бы иметь сигнатуру типа со стороны Java double [] и, конечно, иметь содержимое массива в этом аргументе double [] (копирование содержимого в порядке).
Как я могу это сделать?
Я пытался сделать это с помощью следующего кода, который я поднял из некоторых списков рассылки:
c_backend.i:
%module(directors="1") c_backend
%{
#include "c_backend.h"
%}
%typemap(directorin, descriptor="[D") (double *DOUBLE, size_t LENGTH) {
jdoubleArray jd = (jenv)->NewDoubleArray($2);
(jenv)->SetDoubleArrayRegion(jd, 0, $2, (jdouble *)$1);
$input = jd;
}
%typemap(directorargout) (double *DOUBLE, size_t LENGTH)
%{(jenv)->GetDoubleArrayRegion($input, 0, $2, (jdouble *)$1); %}
%feature("director") CallbackHandler;
%include "c_backend.h"
c_backend.h:
#ifndef CALLBACK_HANDLER_H
#define CALLBACK_HANDLER_H
#include <stdio.h>
class CallbackHandler {
public:
virtual ~CallbackHandler() {}
virtual void statusUpdate(double *params, size_t size) {
printf("in C++ statusUpdate\n");
}
};
class Server {
public:
void doSomething(CallbackHandler *);
};
#endif
c_backend.cpp :
#include "c_backend.h"
#include <stdio.h>
#include <stdlib.h>
void Server::doSomething(CallbackHandler *ch) {
double *params = (double *)malloc(3*sizeof(double));
params[0] = 1.1;
params[1] = 2.2;
params[2] = 3.3;
printf("In doSomthing\n");
ch->statusUpdate(params,3);
printf("exiting doSomthing\n");
}
JavaFrontend.java:
public class JavaFrontend {
static {
System.loadLibrary("CBackend");
}
public static void main(String[] args) {
JFCallbackHandler jf = new JFCallbackHandler();
new Server().doSomething(jf);
}
public static class JFCallbackHandler extends CallbackHandler {
public void statusUpdate(double params[], long size) {
System.out.println("Java got params: "+params);
}
}
}
И 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 CallbackHandler.java
Swig -версия:
SWIG версии 3.0.8
Собран с лязгом ++ [x86_64- apple-darwin15.2.0]
Конфигурация Варианты: изд + PCRE
Пожалуйста, смотрите http://www.swig.org для отчетности ошибок и далее информация