获得JNIEnv性能的最佳方式是什么?

时间:2014-10-10 09:42:52

标签: java-native-interface xamarin xamarin.android jnienv

我一直在努力寻找一种在C#和Java之间传递数据的快速/高效方式。

到目前为止,我最初和独特的方法是使用JNIEnv。

Java类Adder的简单测试用例:

void add(float[] arr1, float[] arr2, float[] res)
{
        for (int i=0; i<arr1.length; i++)
        {
            res[i] = arr1[i]+arr2[i];
        }
}

在C#方面:

public void Add(float[] arr1, float[] arr2, float[] res)
{
        var methodHandle = JNIEnv.GetMethodID(class_ref, "add","([F[F[F)V");

        IntPtr arr1Handle = JNIEnv.NewArray(arr1);
        IntPtr arr2Handle = JNIEnv.NewArray(arr2);
        IntPtr resHandle = JNIEnv.NewArray(res);

        JNIEnv.CopyArray (arr1, arr1Handle);
        JNIEnv.CopyArray (arr2, arr2Handle);

        JNIEnv.CallVoidMethod(Handle, methodHandle, new JValue(arr1Handle), new JValue(arr2Handle), new JValue(resHandle));

        JNIEnv.CopyArray (resHandle, res);
}

对于相同的物理设备:对于大小为1百万的float []数组,在c#中分析这个Add()方法可以保存200-500毫秒之间的值!请注意,如果我在Android原生Eclipse项目中运行相同的测试,则对该函数的调用需要20-50ms。

如果您需要处理大量数据,如图像,矩阵,以满足实时要求......那么这就变得无法使用了。

任何人都可以建议另一种方法将数据绑定到Java或JNIEnv中的其他方法吗?

感谢您的时间。

0 个答案:

没有答案
相关问题