使用JAVA JNI和c++进行泛型调用

Making generic calls with JAVA JNI and C++

本文关键字:泛型 调用 c++ JAVA JNI 使用      更新时间:2023-10-16

我正在使用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中获得一些与您的良好参数化泛型不向上兼容的东西。

此时,您正在跨越类型化、参数化域(泛型)和非类型化域(JNI)之间的障碍。你必须很好地封装这个屏障,你必须添加粘合代码和错误检查/错误处理代码,以检测何时/如果事情不能很好地转换。

运行时签名只是普通的HashMapArrayList -泛型是编译时的东西。

您可以使用javah为本机函数生成具有正确签名的C头文件

这取决于您想要映射到什么,以及它们是否由您来更改。

如果我是你的话,这里有几个我会试着去的方向:):)

  1. 使用SWIG模板(相关SO问题)或TypeMaps
  2. 做一些反射魔法来对付你自己的自定义通用数据传递的本地API (还没有弄清楚细节,但如果你想遵循它,告诉你在c++端有什么)。

以前有人问过这个问题,您可能想要求助于Luis的数组解决方案。