JNIでJava側にC++で作成した可変長配列を返したい
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_xxxx_helloworld_MainActivity_intFromJNI(
JNIEnv *env,
jobject /* this */,
jstring absolutePath) {// 最初の2引数は必須、3つ目から利用したい引数
int nRet = 0;
std::vector<double> vInfo;
vInfo.emplace_back(1.1);
vInfo.emplace_back(2.2);
vInfo.emplace_back(3.3);
vInfo.emplace_back(4.4);
return nRet;
}
std::vectorのvInfo(実際にどれぐらい作られるかは不明)を何らかの方法でjava側に返す方法を知りたいです。
引数や戻り値は仮設定のため変更可能です。
下記で対応可能でした。
extern "C"
JNIEXPORT jdoubleArray JNICALL
Java_com_example_xxxx_helloworld_MainActivity_InfoFromJNI(
JNIEnv *env,
jobject /* this */,
jstring absolutePath) {// 最初の2引数は必須、3つ目から利用したい引数を追加
std::vector<double> vInfo;
vInfo.emplace_back(1.1);
vInfo.emplace_back(2.2);
vInfo.emplace_back(3.3);
vInfo.emplace_back(4.4);
jdouble arrValues[vInfo.size()];
for(int i = 0; i < vInfo.size(); i++){
arrValues[i] = vInfo[i];
};
jdoubleArray dbArray = env->NewDoubleArray(vInfo.size());
env->SetDoubleArrayRegion(dbArray, 0, vCnfo.size(), arrValues);
return dbArray;
}
Java側
public native double[] InfoFromJNI(String absolutePath);
double[] dbInfo = InfoFromJNI(imagePath);
int nLength = dbInfo.length;
// 後処理