gpt4 book ai didi

android - 通过 JNI 从 Java (SDK) 以 native 代码 (NDK) 访问数组

转载 作者:行者123 更新时间:2023-11-29 22:09:35 25 4
gpt4 key购买 nike

我想高效地访问在 native C 代码中创建和更新的数组。如果需要,我可以将指针或引用从 Java 代码发送到 native 端,并让 C 代码填充它,以便我可以在准备好使用时从 SDK 端读取它。

目前,我就是这样做的。但我认为可以有更好的方法来做到这一点,因为我在 C 端做一个副本,然后每次我在 Java 端发出读取时都会创建一个对象。

我的 Java 代码:

double[] valuesFromNative = getValues();
public static native double[] getValues();
static { System.loadLibrary("test-jni"); }

我的原生(C 而不是 C++)代码:

#define LEN 18
double testDoubleArr[LEN];
jdoubleArray Java_com_test_testActivity_getValues(JNIEnv *env, jclass clazz) {
jboolean isCopy;
int i;
jdoubleArray result = (*env)->NewDoubleArray(env, LEN);
jdouble* destArrayElems = (*env)->GetDoubleArrayElements(env, result, &isCopy);
for (i = 0; i < LEN; i++) {
destArrayElems[i] = testDoubleArr[i];
}
if(isCopy == JNI_TRUE) {
// isCopy should NEVER be JNI_TRUE in this case, right?
// so, i could as well replace this condition with
// assert(isCopy == JNI_FALSE)?
}
return result;
}

这个代码 fragment 有效 - 所以,我正在寻找更有效或更正确的方法来实现同样的事情。

感谢分享您的想法。

最佳答案

我认为 SetDoubleArrayRegion() 会更快。更少的代码和更少的 JNI 调用,这是肯定的。

jdoubleArray result = (*env)->NewDoubleArray(env, LEN); 
(*env)->SetDoubleArrayRegion(env, result, 0, LEN, testDoubleArr);

您甚至不必在 C++ 端创建数组。像这样声明方法:

public static native void getValues(double[] a);   

像这样实现:

void Java_com_test_testActivity_getValues(JNIEnv *env, jclass clazz, jdoubleArray a)
{//...

在Java端创建数组,缓存在实例变量什么的,传给JNI,需要的时候填充。确保关于数组大小的假设在 Java 端和 C 端是相同的。

关于android - 通过 JNI 从 Java (SDK) 以 native 代码 (NDK) 访问数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9986393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com