我正在使用 JNI,我必须将一些通用类型传递给 C++。我对如何在 C++ 方面处理这个问题感到困惑
HashMap<String, Double[]> data1 ;
ArrayList<ArrayList<String>> disc ;
我是 JNI 的新手,环顾四周但找不到太多帮助。请有人帮助我如何为此编写 JNI 代码。对网上 Material 的任何引用也将非常有帮助。
最佳答案
简短的回答:你不能。
长答案:类型删除:http://download.oracle.com/javase/tutorial/java/generics/erasure.html
考虑 ArrayList<Integer>
的参数化实例.在编译时,编译器会检查您是否没有放置与 Integer
兼容的内容。在数组列表实例中。
但是,同样在编译时(以及语法检查之后),编译器会剥离类型参数,呈现 ArrayList<Integer>
进入Arraylist<?>
相当于ArrayList<Object>
或者简单地 ArrayList
(与 pre JDK 中一样 5 次。)
后一种形式是 JNI 所期望的(由于历史原因以及泛型在 Java 中的实现方式......同样,类型删除。)
记住,一个 ArrayList<Integer>
是一个ArrayList
.所以你可以传递 ArrayList<Integer>
到 JNI 它期望 ArrayList
的任何地方.相反的情况不一定正确,因为您可能会从 JNI 中得到一些与您的参数化良好的泛型不向上兼容的东西。
此时,您正在跨越类型化、参数化域(您的泛型)和非类型化域 (JNI) 之间的障碍。你必须很好地封装这个障碍,你必须添加胶水代码和错误检查/错误处理代码来检测什么时候/如果事情不能很好地转换。
关于java - 使用 JAVA JNI 和 C++ 进行通用调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5641499/