JNI, какие типы я могу использовать вместо заданных (unsigned int, const char *, const wchar_t *, ....) - PullRequest
0 голосов
/ 11 мая 2011

Stackoverflow Пользователи!

Я пытаюсь преобразовать некоторые функции, написанные на С ++, в Java. Именно у меня есть библиотека .so, которую я написал на c ++, и теперь я должен вызывать функции из своего приложения Android. Функции как это:

unsignd int Uninitialize();
---------------------------------------
unsignd int DeviceOpen(
    const wchar_t* deviceID,
    unsigned long* phDevice);
---------------------------------------
typedef struct BlobData_s {
     unsigned long     length;
     unsigned char     data[1];
} dsmBlobData_t;

unsignd int Enroll(
    unsigned long       hDevice,
    const char*         userID,
    BlobData_s*         pInputInfo,
    void*               pUserData);

Теперь, как вы можете видеть, у меня есть функции и определения типов, которые я хочу написать в стиле Java, но моя проблема в том, что нет unsigned int типа Java ( ссылка ). Я знал, что вместо int я могу использовать jint, вместо char* я могу использовать jchar*, но что я должен делать с

  • const wchar_t*
  • unsigned long
  • unsigned char

Что я могу использовать вместо этих типов.

Я пытаюсь таким образом

jint Java_com_example_testApp_TestApp_DeviceOpen( jchar* deviceID, int* phDevice)
{ 
      return DeviceOpen((const wchar_t*)deviceID, (unsigned long*)phDevice);
}

Я прав? *

Заранее спасибо, ViToBrothers.

Ответы [ 2 ]

1 голос
/ 11 мая 2011

Для начала вам нужно сопоставить ваши типы с типами Java. Как ты говоришь, в Java нет unsigned и wchar_t. Как только вы решили какие типы использовать на стороне Java (например, int вместо unsigned, или возможно long; и, вероятно, java.lang.String для char* и wchar_t*), вам придется объявлять ваши нативные методы, используя их, и реализовать JNI таким образом, чтобы сопоставить их с вашими внутренними значениями.

Кроме того, если ваш код C ++ использует исключения, вам придется их перехватывать и переназначить их в интерфейсе JNI.

Для начала я бы посмотрел, может ли какой-нибудь существующий инструмент, например, swig, выполнить работа. Если этого не произойдет, я все равно буду использовать его для получения примера кода, который затем может быть скопированным / вставленным и отредактированным.

1 голос
/ 11 мая 2011

Я не верю, что вы можете использовать jchar*, так как это недопустимый тип для Java.

Я предлагаю вам использовать javah для генерации заголовка Java из класса Java с нативными методами. Это покажет вам правильные типы для использования. (Я не знаю, что такое эквивалент для Android)

Во многих случаях нет прямых эквивалентов, поэтому вы должны использовать методы для копирования данных.

Кстати: я бы не стал так беспокоиться о неподписанных и подписанных, поскольку число, о котором идет речь, просто хранит идентификатор. Это не те значения, с которыми вы можете выполнять арифметические операции.

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