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

时间:2011-04-12 20:52:54

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

我正在使用JNI,我必须将一些泛型类型传递给C ++。我坚持如何在C ++方面解决这个问题

HashMap<String, Double[]> data1 ; 
ArrayList<ArrayList<String>> disc ;

我是JNI的新手,环顾四周但找不到多少帮助。有人可以帮我如何为此编写JNI代码。任何对网上资料的提及都会非常有用。

3 个答案:

答案 0 :(得分:7)

简短的回答:你不能。

答案很长:输入Erasure: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)之间的障碍。你必须很好地封装那个障碍,你必须添加胶水代码和错误检查/错误处理代码来检测何时/如果事情不能很好地转换。

答案 1 :(得分:6)

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

您可以使用javah生成带有正确签名的C头文件。

答案 2 :(得分:0)

这取决于您要映射到的内容以及它们是否属于您的更改。

以下是我试图去的几个方向(如果我是你,那就是:)):

  1. 使用SWIG templatesrelated SO question)或TypeMaps
  2. 做一些反思魔法用于反对你自己的自定义通用数据传递本机API(没有想出详细信息,但是如果你想继续使用它,告诉你是什么加入了C ++方面)。
  3. 这是asked before,您可能想要使用Luis的阵列解决方案。