Выполнение общих вызовов с JAVA JNI и C ++ - PullRequest
3 голосов
/ 13 апреля 2011

Я работаю с JNI, и мне нужно передать несколько общих типов в C ++. Я застрял с тем, как подойти к этому на стороне C ++

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

Я новичок в JNI и посмотрел вокруг, но не смог найти большую помощь Может кто-нибудь помочь мне, как написать код JNI для этого, пожалуйста. Любая ссылка на материал в сети тоже будет очень полезна.

Ответы [ 3 ]

8 голосов
/ 13 апреля 2011

Краткий ответ: вы не можете.

Длинный ответ: Тип Erasure: http://download.oracle.com/javase/tutorial/java/generics/erasure.html

Рассмотрим параметризованный экземпляр ArrayList<Integer>.Во время компиляции компилятор проверяет, что вы не помещаете в экземпляр списка массивов ничего, кроме совместимых с Integer.

Однако, также во время компиляции (и после синтаксической проверки) компилятор удаляет типпараметр, переводящий ArrayList<Integer> в Arraylist<?>, что эквивалентно ArrayList<Object> или просто ArrayList (как в pre JDK 5 раз.)

Более поздняя форма - это то, что ожидает JNI (из-за исторических причин кака также из-за того, как дженерики реализованы в Java ... опять же, тип erasure.)

Помните, ArrayList<Integer> is-a ArrayList.Таким образом, вы можете передать ArrayList<Integer> в JNI везде, где он ожидает ArrayList.Обратное не обязательно верно, так как вы можете получить что-то из JNI, которое не совместимо вверх с вашими хорошо параметризованными обобщениями.

В этот момент вы пересекаете барьер между типизированным параметризованным доменом (вашими обобщениями)и нетипизированный (JNI).Вы должны довольно красиво инкапсулировать этот барьер, и вы должны добавить клейкий код и код проверки ошибок / обработки ошибок, чтобы определить, когда / если что-то не очень хорошо конвертируется.

6 голосов
/ 13 апреля 2011

Сигнатура времени выполнения проста: HashMap и ArrayList - Обобщения являются вещью времени компиляции.

Вы можете использовать javah для генерации файла заголовка C с правильными сигнатурами для собственных функций.

0 голосов
/ 13 апреля 2011

Это зависит от того, что вы пытаетесь сопоставить, и если они ваши, чтобы изменить.

Вот несколько направлений, по которым я бы попытался (если бы я был вами, то есть :)):

  1. Использование SWIG-шаблонов ( связанный вопрос SO ) или TypeMaps .
  2. Использование некоторой магии отражения для использования с собственным собственным API-интерфейсом для передачи общих данных ( гавань)не разобрался в деталях, но если вы хотите следить за этим, расскажите, что у вас есть на стороне C ++ ).

Это было задано до и вы, возможно, захотите прибегнуть к решению Луиса для массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...