2014-06-05 21 views
6

Tôi đang sử dụng API C++ của bên thứ ba cho dự án của mình và có chức năng với giá trị trả về với các loại std::vector<int>, std::vector<bool>, std::vector<double>. Tôi cần phải chuyển các biến với các kiểu này sang Java. Vì vậy, tôi đang sử dụng JNI và chức năng của tôi đã trả về các giá trị với các loại jintArray, jbooleanArray, jdoubleArray.chuyển đổi loại vector nguyên gốc C++ thành mảng loại nguyên thủy java

Tôi đang sử dụng đoạn mã sau để chuyển đổi double loại:

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; 

Tôi đã không có vấn đề với khối mã này. Nhưng khi tôi muốn làm điều này cho intbool loại có một vấn đề ví dụ sau:

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

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

Vấn đề là với các định nghĩa của jintjboolean, vì:

typedef long   jint; 
typedef unsigned char jboolean; 

và cho jdouble:

typedef double   jdouble; 

Như, bạn có thể thấy giải pháp thuận tiện của tôi cho double không hoạt động cho các loại intbool vì typedef của chúng không khớp.

Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể làm chuyển đổi này cho tất cả các loại nguyên thủy thuận tiện?

Cảm ơn trước

+0

Tạo một nhà máy? – ChiefTwoPencils

+0

Ồ, đó là gì? – guneykayim

Trả lời

2

Từ các kiểu dữ liệu có thể có kích thước khác nhau, bạn phải sao chép các vector. Cách đơn giản nhất để làm điều này là

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

Tất nhiên, bạn có thể phân bổ các jBooleanArray và thiết lập các yếu tố trong một vòng lặp for hoặc viết một wrapper cho nó mà hoạt động như một container STL.

Các vấn đề liên quan