JavaコードからC++コードへ多次元配列(Javaではshort[][]
、short int[][]
)を送信し、いくつかの共変を処理してから、Javaコードで配列を取得したいと考えています。SWIGでJavaとC++の間で多次元配列を渡す方法は?
1次元配列では問題ありません。
example.i:
%module example
%{
#include <iostream>
#include "example.h"
%}
%typemap(jtype) short int values[] "short[]"
%typemap(jstype) short int[] "short[]"
%typemap(javain) short int values[] "$javainput"
%typemap(jni) short int values[] "jshortArray"
%typemap(in) short int values[] {
jboolean isCopy;
$1 = JCALL2(GetShortArrayElements, jenv, $input, &isCopy);
}
%typemap(in,numinputs=0,noblock=1) int *data_len {
int temp_len;
$1 = &temp_len;
}
%typemap(jstype) const short int *CPPtoJava "short[]"
%typemap(jtype) const short int *CPPtoJava "short[]"
%typemap(jni) const short int *CPPtoJava "jshortArray"
%typemap(javaout) const short int *CPPtoJava {
return $jnicall;
}
%typemap(out) const short int *CPPtoJava {
$result = JCALL1(NewShortArray, jenv, temp_len);
JCALL4(SetShortArrayRegion, jenv, $result, 0, temp_len, $1);
}
%include "example.h"
example.h:
class Test
{
public:
short int* data;
size_t l;
void JavaToCPP(short int values[], size_t len) {
this->l = len;
this->data = values;
}
const short int *CPPtoJava(int *data_len){
*data_len = this->l ;
return this->data;
}
void process(){
for(int i = 0 ; i< this->l ; i++){
this->data[i] = i;
}
}
};
MainRunner.java
public class MainRunner {
public static void main(String[] argv) {
System.load("/path/to/../libexample.so");
short in[] = {0,0,0};
System.out.println("\nInput : ");
for (int i = 0; i < in.length; ++i) {
System.out.print(in[i] + "\t");
}
Test t = new Test();
t.JavaToCPP(in,(long)in.length);
t.process();
short[] out = t.CPPtoJava();
System.out.println("\n\nOutput : ");
for (int i = 0; i < out.length; ++i) {
System.out.print(out[i] + "\t");
}
}
}
あなたはガブガブ飲むにmutlidimensionalの配列を処理する方法を知っていますか?
ありがとうございました!
は 'のstdです::ベクトル 'オプション?物事をより簡単にする – Flexo