من به صورت زیر فقط باید از سمت java به صورت آرایه پاس بدید. این متدهای سمت jni از یک کلاس Utility خودم هستش.
td::vector<char> Utility::j2CByteArray(JNIEnv * env,jbyteArray jba){
std::vector<char> result;
unsigned char * isCopy;
jbyte* jbae = env->GetByteArrayElements(jba, isCopy);
jsize len = env->GetArrayLength(jba);
char * imageSource = (char *)jbae;
for (int i = 0; i < len; i++)
result.push_back(imageSource[i]);
return result;
}
std::vector<float > Utility::j2CFloatArray(JNIEnv * env,jfloatArray jba){
std::vector<float> result;
unsigned char * isCopy;
jfloat * jbae = env->GetFloatArrayElements(jba, isCopy);
jsize len = env->GetArrayLength(jba);
float * imageSource = (float *)jbae;
for (int i = 0; i < len; i++)
result.push_back(imageSource[i]);
return result;
}
jbyteArray Utility::c2JByteArray(JNIEnv * env,std::vector<char> arr){
jbyte* buff = new jbyte[arr.size()];
jbyteArray result = env->NewByteArray(arr.size());
for (int i = 0; i < arr.size(); i++) {
buff[i] = (jbyte)arr[i];
}
env->SetByteArrayRegion(result, 0, arr.size(), buff);
return result;
}
jfloatArray Utility::c2JFloatArray(JNIEnv * env,std::vector<float> arr) {
jfloat * buff = new jfloat[arr.size()];
jfloatArray result = env->NewFloatArray(arr.size());
for (int i = 0; i < arr.size(); i++) {
buff[i] = (jfloat)arr[i];
}
env->SetFloatArrayRegion(result, 0, arr.size(), buff);
return result;
}
سیگنیچر در سمت جاوا هم به صورت مثلا float[] و یا char[] باشه.