Scala: создание / использование пользовательских типов в методах JNI

0

У меня разные методы Scala. Некоторые примеры:

@native protected def xOpen(): Long
@native protected def flushNative(xServPtr: Long): Unit
@native protected def drawLineNative(xServPtr: Long, winPtr: Long, x1: Int, y1: Int, x2: Int, y2: Int): Unit
@native protected def newGraphicsContextNative(xServPtr: Long, winPtr: Long): Long

//And a couple of the signatures from the C++ file.
extern "C" JNIEXPORT void JNICALL Java_pXClient_XCClass_flushNative(JNIEnv * env, jobject c1, jlong displayPtr)
extern "C" JNIEXPORT jlong JNICALL Java_pXClient_XCClass_newGraphicsContextNative(JNIEnv * env, jobject c1,
    jlong displayPtr, jlong winPtr)

Я хотел бы иметь более сильную печать на указателях, а не передавать их всем, как долго. Есть ли способ использовать классы AnyVal здесь, например:

class XServPtr(val value: Long) extends AnyVal
class WinPtr(val value: Long) extends AnyVal

и могу ли я добавить пользовательские типы в JNI? Затем я мог бы сделать индивидуальные c++ неявные преобразования типов из типа JNI конкретному типу указателя c++ и иметь безопасность типов с обоих концов.

Теги:
jni

1 ответ

0

Если вы хотите быть явным в своих типах, вы можете использовать что-то вроде

type wPtr = Any
type HANDLE = wPtr
type HWND = wPtr
@native def SHGetFolderPath(hwndOwner: HWND, nFolder: Int, hToken: HANDLE, dwFlags: Int, pszPath: Array[Char]): Int

... по крайней мере, я собираюсь дать это:

EDIT: В конце концов я сделал версию Scala @585534, чтобы сделать то, что я хотел.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню