2013-03-08 4 views
3

Теперь я пишу версию старого кода c/C++ для JNI, которую я написал ранее в этом году, чтобы включить в мое приложение для Android. Я написал настольное приложение, эквивалентное тому, что я пишу, как на Java, так и на C++, и разница в производительности заметно, и поэтому я хочу использовать ndk.JNI и старый код на C++

Я чрезвычайно новичок в JNI, и, как я понимаю вещи, кажется, что мне нужно сделать какое-то картографирование типов; jdouble на замену double, jint на замену int и так далее. Дело в том, что я пробовал использовать один из моих старых кодов без изменений, и это сработало! У меня даже есть некоторые библиотеки STL (list и vector), и у меня не было проблем. Я просто включил APP_STL := stlport_static в файл Android.mk.

Итак, мои вопросы: есть ли штраф за исполнение при этом? Есть ли другой риск, о котором я должен знать? В чем заключается недостаток использования примитивных типов C/C++ в моем jni? Могу ли я сделать код быстрее, или я не буду беспокоиться?

Спасибо,

NAX

ответ

2

Родные типы в JNI (jint, ...) просто typedef псевдонимы типов C. Они существуют для переносимости кода, когда внутреннее представление Java точно не соответствует C, а именно относительно размера бит. Таким образом, при их смешивании не должно быть никаких накладных расходов на производительность.

Риск или недостаток их смешивания заключается в том, что если на какой-либо платформе они имеют разные размеры бит, вы можете потерять биты при преобразовании взад и вперед. Таким образом, вы можете сделать некоторые дополнительные проверки при создании кода, чтобы убедиться, что он безопасен.

+0

Ну, это обнадеживает! Большое спасибо – naxchange

+1

В частности, типы Java имеют четко определенные ширины и подпись - 'jint' - это 32-битное знаковое значение,' jlong' - это подписанное 64-битное значение, 'jchar' - это unsigned 16-bit значение и т. д. Они не зависят от платформы. См. Http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html. – fadden

Смежные вопросы