2014-02-21 5 views
1

У меня есть класс, успешно использующий несколько методов JNI. Однако я хочу изменить его на свойство, и я не могу получить правильные сигнатуры функций для файла C++. Компилятор Scalac создает файл класса для признака с тем же именем, что и класс. Когда я бегу javah на этом файле класса он дает мне одни и те же с функции подписи, как с классом Но эти подписи дают мне:Scala: использование собственных методов JNI в чертах

Метод XOpen в классе pXClient/XCClass имеет незаконные модификаторы: 0x501

Оригинальные предложения класса методы для библиотеки xlib, но я хочу иметь альтернативы Opengl поверх Xlib и opengl поверх xcb, а также только xcb. Более поздние комбинации могут быть для Wayland или Opengl на клиенте Windows. Таким образом, методы должны быть разбиты на черты, которые могут быть смешаны в

ответ

1

Пара способов обработки:.

1) Вы можете использовать стандартный ООП состав:

trait MyIntefaceIWantToExpose{ 
    def foo(bar: Baz) 
} 

class MyRealized extends MyJniClass with MyInterfaceIWantToExpose 

class SomeOtherClass(stuff: MyInterfaceIWantToExpose){ 
    def something(bar: Baz){ 
    stuff foo bar 
    } 
} 

в котором вы, возможно, потребуется для передачи фактической реализации для вашего «MyRealized», который делегирует вызовы функций классу JNI.

class MyJni{ 
    def add(x: Int):Int = { /* native code */ } 
} 

trait MyInterface{ 
    def thing(x: Int): Int 
} 

class MyRealized extends MyJni with MyInterface{ 
    def thing(x: Int) = add(x) 
} 

2) Черта может расширить класс, сделать его абстрактным, без конструкторов:

trait MyExtention extends MyJniClass{ 
    def whole(lotta: Love): Yay 
} 

Обратите внимание, что это эквивалентно следующему (более или менее):

trait MyExtention{ 
    self: MyJniClass => 
} 

, который является типом self или ограничением, в котором говорится, что класс, с которым вы работаете, должен расширять класс «MyJniClass».

+0

Это не решает мою проблему. Я хочу иметь возможность смешивать jni-методы с другими классами. –

+0

Вам придется либо использовать композицию, либо использовать ее с делегатом. Я обновлю. – wheaties

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