java - 使用 JAVA JNI 和 C++ 进行通用调用

标签 java c++ generics java-native-interface

我正在使用 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/

相关文章:

java - Mockito:使用泛型列出匹配器

c++ - C语言中extern存储类说明符的重要性和用法

java - 如何解释 Java 8 和 Java 7 中 HashMap 的插入性能

java - 通过 PDFBox 访问图像的 "alternate text"

java - 使用正则表达式的棘手拆分字符串

c++ - 是选择模板函数的重载还是仿函数(函数对象)的部分特化

c++ - Gmock 匹配器匹配类型

c# - 尝试添加索引器时如何解决 C# 编译器错误 CS0102?

c# - 为什么我不能将泛型类型的一个实例化转换为另一个实例化?

java - Eclipse - 悬停不显示抽象 Java 类中的变量