Какой тип данных JNI? - PullRequest
       13

Какой тип данных JNI?

2 голосов
/ 29 октября 2011

Я написал некоторый код, который передает значения между java и c, используя jni.

В настоящее время все числовые значения определены как int (java) -> jnit (jni / c) -> unsigned int (c)

Код работает, но он ДЕЙСТВИТЕЛЬНО неэффективен, поскольку не все передаваемые числа нуждаются в памяти, доступной для целого числа.

У меня есть 3 типа значений в моем коде, которые должны содержать диапазоны чисел 04294967295, от 0 до 255 и от 0 до 1.

Я не могу определить совместимые типы данных для всех 3 "языков".

Range           Java          C/JNI          C
4294967296      int           jint           unsigned int
256             ???           ???            unsigned char
2               boolean       jboolean       ???

Подскажите, пожалуйста, какие типы данных янужно использовать для ??? s выше?

Спасибо G

Ответы [ 2 ]

1 голос
/ 29 октября 2011

Что касается логического значения в C, то на этом сайте есть ответ

, а в java диапазон 256 будет охватываться байтами, однако они подписаны, поэтому использование может оказаться прощешорты.По сути, java-типы подписаны, и самый простой способ справиться с этим - убедиться, что тип, к которому вы привязываете, больше, чем диапазон, который вы хотите включить, такой короткий для диапазона 256 и длинный для 4.2x10 ^ 9, как охватывает int2 147 483 648 и максимальное значение 2 147 483 647.

1 голос
/ 29 октября 2011

Помните, что в Java нет неподписанных типов. Таким образом, Java int на самом деле не сможет хранить все значения C unsigned int. Вы также работаете в предположении, что C unsigned int всегда имеет ширину 32 бита. Это может быть другой размер, хотя отрасль несколько стандартизирована.

При этом, следуя логике, которую вы здесь используете, int равно jint равно unsigned int, byte равно jbyte равно unsigned char и boolean от jboolean до _Bool (недоиспользуемый тип C99, который может содержать в качестве значения только 1 или 0)

Обратите внимание, что char в C не совпадает с char в Java; первый представляет один байт, сколь бы большим он ни был, в то время как последний представляет символ UTF-16. Также обратите внимание, что char может быть подписан или не подписан в C в зависимости от компилятора и платформы, поэтому для безопасности следует явно использовать signed char, если знак может иметь значение.

...