2014-06-05 24 views
6

Ich verwende eine C++ - API von Drittanbietern für mein Projekt und es hat Funktionen mit Rückgabewerte mit den Typen std::vector<int>, std::vector<bool>, std::vector<double>. Ich muss Variablen mit diesen Typen an Java übergeben. Also verwende ich JNI und meine Funktion hat Rückgabewerte mit den Typen jintArray, jbooleanArray, jdoubleArray.konvertieren C++ primitiven Typ Vektor zu Java primitiven Typ Array

Ich verwende folgenden Code double Typ zu konvertieren:

std::vector<double> data; 
//fill data 
jdouble *outArray = &data[0]; 
jdoubleArray outJNIArray = (*env).NewDoubleArray(data.size()); // allocate 
if (NULL == outJNIArray) return NULL; 
(*env).SetDoubleArrayRegion(outJNIArray, 0 , data.size(), outArray); // copy 
return outJNIArray; 

ich kein Problem mit diesem Code-Block haben. Aber wenn ich dies für int und bool Arten tun wollen gibt es ein Problem bei der folgenden:

std::vector<int> data; 
//fill data 
jint *outArray = &data[0]; 

und

std::vector<bool> data; 
//fill data 
jboolean *outArray = &data[0]; 

Das Problem ist mit Definitionen von jint und jboolean, da:

typedef long   jint; 
typedef unsigned char jboolean; 

und für jdouble:

stimmt nicht überein
typedef double   jdouble; 

Wie können Sie meine bequeme Lösung für double sehen nicht, da ihre typedefs für int und bool Typen funktioniert.

Also, meine Frage ist, wie kann ich diese Konvertierung für alle primitiven Typen tun bequem?

Vielen Dank im Voraus

+0

Fabrik herstellen? – ChiefTwoPencils

+0

Oh, was ist das? – guneykayim

Antwort

2

Da die Datentypen können unterschiedliche Größen haben Sie den Vektor kopieren. Der einfachste Weg, dies zu tun ist

std::vector<jboolean> tmp(data.begin(), data.end()); 
jboolean *outArray = &tmp[0]; 

Natürlich können Sie die jBooleanArray und legen Sie die Elemente in einer for-Schleife oder schreiben einen Wrapper für sie zuteilen, die wie ein STL-Container verhält.

Verwandte Themen