Я пытаюсь изменить некоторые значения в jfloatArray, прежде чем возвращать его в java-код Android. Я обнаружил, что не могу использовать обычный способ newArray[i] = result[i];
, чтобы сделать это, и вместо этого я должен сделать env->SetFloatArrayElement(newArray,i,result[i]);
.JNI SetFloatArrayElement() не работает
Проблема заключается в том, что эта функция вызывает ошибку:
[armeabi-v7a] Compile++ arm : tensorflow_mnist <= tensorflow_jni.cc jni/./tensorflow_jni.cc: In function '_jfloatArray* Java_jp_narr_tensorflowmnist_DigitDetector_detectDigit(JNIEnv*, jobject, jintArray)': jni/./tensorflow_jni.cc:171:14: error: 'JNIEnv' has no member named 'SetFloatArrayElement' env->SetFloatArrayElement(newArray,i,result[i]); ^
Код:
JNIEXPORT jfloatArray JNICALL
TENSORFLOW_METHOD(detectDigit)(JNIEnv* env, jobject thiz, jintArray raw_pixels) {
jboolean iCopied = JNI_FALSE;
jint* pixels = env->GetIntArrayElements(raw_pixels, &iCopied);
jfloatArray newArray = env->NewFloatArray(2);
jfloat *result = process(reinterpret_cast<int*>(pixels));
for(int i=0; i<2; ++i) {
//VLOG(0) << " (" << i << "): " << newArray[i];
//newArray[i] = result[i];
//env->SetFloatArrayElement(newArray,i,result[i]);
}
env->ReleaseIntArrayElements(raw_pixels, pixels, JNI_ABORT);
env->ReleaseFloatArrayElements(newArray, result, JNI_ABORT);
free(result);
return newArray;
}
Я действительно нашел SetFloatArrayElement() в ссылке JNI для Unity3D. https://docs.unity3d.com/ScriptReference/AndroidJNI.SetFloatArrayElement.html Спасибо, хотя. Теперь я использую SetFloatArrayRegion(). – BernardoGO
@BernardoGO, очевидно, AndroidJNI не отображает 1: 1 на JNI. Я вижу, как это может стать сюрпризом. FWIW, каноническая ссылка для JNI будет [предоставлена Oracle] (https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html). –
О, я вижу. благодаря – BernardoGO