使用JAVA JNI和c++进行泛型调用
Making generic calls with JAVA JNI and C++
我正在使用JNI,我必须将一些泛型类型传递给c++。我被如何在c++方面处理这个问题所困扰
HashMap<String, Double[]> data1 ;
ArrayList<ArrayList<String>> disc ;
我是JNI的新手,环顾四周,但找不到太多帮助。有人可以帮助我如何编写JNI代码,请。参考网上的资料也会很有帮助。
简短的回答:你不能。
长回答:类型擦除:http://download.oracle.com/javase/tutorial/java/generics/erasure.html
考虑ArrayList<Integer>
的一个参数化实例。在编译时,编译器检查你没有在数组列表实例中放入任何与Integer
兼容的东西。
然而,同样在编译时(在语法检查之后),编译器剥离类型参数,将ArrayList<Integer>
呈现为Arraylist<?>
,相当于ArrayList<Object>
或简单地ArrayList
(如在JDK之前的5次)
后一种形式是JNI所期望的(由于历史原因以及在Java中实现泛型的方式…再次输入橡皮擦)
记住,一个ArrayList<Integer>
是一个ArrayList
。因此,您可以将ArrayList<Integer>
传递给JNI,只要它需要ArrayList
。相反的情况不一定是正确的,因为您可能会从JNI中获得一些与您的良好参数化泛型不向上兼容的东西。
运行时签名只是普通的HashMap
和ArrayList
-泛型是编译时的东西。
您可以使用javah
为本机函数生成具有正确签名的C头文件
这取决于您想要映射到什么,以及它们是否由您来更改。
如果我是你的话,这里有几个我会试着去的方向:):)
- 使用SWIG模板(相关SO问题)或TypeMaps
- 做一些反射魔法来对付你自己的自定义通用数据传递的本地API (还没有弄清楚细节,但如果你想遵循它,告诉你在c++端有什么)。
以前有人问过这个问题,您可能想要求助于Luis的数组解决方案。
相关文章:
- 错误处理.将系统错误代码映射到泛型
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 链表的泛型函数remove()与成员函数remove)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何编写将要继承的泛型代码?
- C++17 如何保存泛型可调用对象以供以后使用
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- C++泛型类错误,问题出在哪里?
- C++泛型类,单独实现?
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 从具有泛型返回类型的 crtp 基类调用派生类中的函数
- 使用泛型函数调用打印结构的所有嵌套成员变量
- 为什么我的函数调用与此泛型函数实现不匹配?
- 对元组的每个元素进行泛型调用成员函数
- 使用基类的泛型方法指针调用派生类的方法
- 无法调用继承的受保护泛型类成员
- 对泛型函数的调用没有匹配的函数
- 如何在专门化版本中调用泛型模板函数
- 使用JAVA JNI和c++进行泛型调用