Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过JNI从Java(SDK)访问本机代码(NDK)中的数组_Android_Android Ndk_Java Native Interface_Jniwrapper - Fatal编程技术网

Android 通过JNI从Java(SDK)访问本机代码(NDK)中的数组

Android 通过JNI从Java(SDK)访问本机代码(NDK)中的数组,android,android-ndk,java-native-interface,jniwrapper,Android,Android Ndk,Java Native Interface,Jniwrapper,我想高效地访问在本机C代码中创建和更新的数组。如果需要,我可以将Java代码中的指针或引用发送到本机端,并让C代码填充它,以便在SDK端可以读取它 目前,我就是这样做的。但我认为有更好的方法可以做到这一点,因为我在C端做一个拷贝,然后每次我在Java端发出read时都会创建一个对象 我的Java代码: double[] valuesFromNative = getValues(); public static native double[] getValues(); static { Syste

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

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

我的Java代码:

double[] valuesFromNative = getValues();
public static native double[] getValues();
static { System.loadLibrary("test-jni"); }
我的本机(C而非C++)代码:

#定义LEN 18
双测试双arr[LEN];
jdoubleArray Java_com_test_testActivity_getValues(JNIEnv*env,jclass clazz){
jboolean-isCopy;
int i;
jdoubleArray结果=(*env)->NewDoubleArray(env,LEN);
jdouble*destrarylems=(*env)->GetDoubleArrayElements(env、result和isCopy);
对于(i=0;i
这个代码片段很有效——因此,我正在寻找更有效或者更正确的方法来实现同样的目标


谢谢分享您的想法。

我认为
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)
{//...
这样实施:

public static native void getValues(double[] a);   
void Java_com_test_testActivity_getValues(JNIEnv *env, jclass clazz, jdoubleArray a)
{//...

在Java端创建数组,将其缓存在实例变量或其他东西中,并在需要时将其传递给JNI进行填充。确保Java端和C端对数组大小的假设是相同的。

这是一个好的开始。每次调用getValues()时,是否可以在java端保存double[]对象的创建?我们可以传递一个指向本机端的指针并在那里填充数组,然后在sdk端读取它吗?谢谢。在本机方法中引入
jdoubleArray
参数,在Java端创建数组,并将其传递给JNI以填充值。不过要注意尺寸匹配。