LINUX.ORG.RU

Си long в Java Long используя JNI

 , , ,


0

1

Хотел приделать поддержку вибры в игре для Android. Методы активации вибры принимают Long и Long[]. Используя JNI сишный лонг портится (32 бита в native против 64 в яве).

Пока сделал костыль - из си передаю long long:

void vibrate(long long time)
{
   // call to java static method
   jmethodID methodId = env->GetStaticMethodID(cls, "nativeVibrate", "(J)V");
   env->GallStaticVoidMethod(cls, methodId, time);
}

Это прототипы методов в яве:

public abstract void vibrate(long milliseconds)
Есть ли способ правильнее?

★★★★★

Последнее исправление: ymn (всего исправлений: 1)

Есть int64_t из <stdint.h>. А на деле лишь бы работало, мы указатели в long пихали для вызова не-сишного коллбека (на ARM указатель 32 битный), и ничего не сломалось.

quiet_readonly ★★★★
()
Последнее исправление: quiet_readonly (всего исправлений: 1)
Ответ на: комментарий от quiet_readonly

Так а чем это будет лучше костыля long long? Я надеялся, что JNI должен брать на себя обязанность конверсии типов, а он, редиска болт кладет.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от anonymous

jlong?

Что вы имеете ввиду? Каст в jlong:

void vibrate(long time)
{
   // call to java static method
   jmethodID methodId = env->GetStaticMethodID(cls, "nativeVibrate", "(J)V");
   env->GallStaticVoidMethod(cls, methodId, (jlong)time);
}
andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Так а чем это будет лучше костыля long long? Я надеялся, что JNI должен брать на себя обязанность конверсии типов, а он, редиска болт кладет.

В Java long гарантированно имеет 8 байт, в C++ uint64_t тоже гарантированно имеет 8 байт, никаких костылей.

quiet_readonly ★★★★
()
Ответ на: комментарий от andreyu

Java Native Interface. Mapping types: тип jlong является типом __int64. поищи как у тебя объявлен тип jlong.

void vibrate(jlong time)
{
   // call to java static method
   jmethodID methodId = env->GetStaticMethodID(cls, "nativeVibrate", "(J)V");
   env->GallStaticVoidMethod(cls, methodId, time);
}

anonymous
()

Спасибо всем отписавшимся.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от qulinxao

если 32 бита натив то почему не Java.int?

Потому, что прототип метода vibrate хочет лонг:

public abstract void vibrate(long milliseconds)
andreyu ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.