我正在使用Java11 (+ IntelliJ集成开发环境)。我的代码通过JNI从3D方C++库中检索多维数组。
我的代码如下所示:
Object[][][] param1 = {{{"somevalue"}}};
Object[] param2 = param1
Object[][][] param3 = (Object[][][])param2; //OK
Object[][][] result1 = SomeNativeLibrary.someNativeCall(param1);
Object someResult = result1[0][0][4]; //OK
Object[] result2 = result1;
Object[][][] result3 = (Object[][][])result2; //CastException通过我的调试器,我可以清楚地看到param1和result1的结构是不同的(尽管两者都被假定为三维数组):
对于param1:{Object[1][][]} -> {Object[1][]} -> {Object{1}}
对于result1:{Object[1]} -> {Object[1]} -> {Object[4]}
尽管从param2到param3的强制转换没有问题,但从result2到result3的强制转换失败,并显示了
"java.lang.CastException: class [Ljava.lang.Object; cannot be case to class [[[Ljava.lang.Object" (notice the single square-bracket versus triple square-bracket before the "L").我面临的问题是,我通过某个远程处理框架返回result1。所以我最终(在远程处理的客户端/调用端)得到了一个一维数组,就像上面的result2。
1)如何将result2转换回Object[]数组,以便更容易地访问数据?
2)为什么可以从param2转换到param3,但不能从result2转换到result3?
发布于 2021-02-15 21:59:16
查找SomeNativeLibrary.someNativeCall(param1)的文档,并检查它实际返回的内容。CastException显示它在类文件中被声明为对象的一维数组,因此您需要将其视为一维数组。
如果它最初是一个多维数组,那么它很可能在Java语言中表示为一维数组,元素(x,y,z)位于索引x*Y*Z + y*Z + z处,其中Y是y方向上的维数,Z是z方向上的维数。但请查看文档以确保以这种方式使用它。
Java中的多维数组不是这样构造的,而是作为指向其他数组的指针的一维数组。因此不能直接将其转换为多维Java数组。
https://stackoverflow.com/questions/66202113
复制相似问题