我有一个类成功使用了许多JNI方法。但是,我想将其更改为特征,我无法获得C ++文件的正确功能签名。 Scalac编译器为特征生成一个与该类同名的类文件。当我在这个类文件上运行javah时,它给了我与类相同的c函数签名但是这些签名给了我:
方法xOpen在类pXClient / XCClass中有非法修饰符:0x501
原始类为xlib库提供了方法,但是我希望在Xlib和opengl之上在xcb和xcb之上提供Opengl的替代方案。以后的组合可以是Windows客户端上的Wayland或Opengl。因此,需要将这些方法分解为可混合的特征。
答案 0 :(得分:1)
处理这个的几种方法:
1)您使用标准OOP组合:
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 =>
}
这是一个自我类型或约束,表示您正在使用的类必须扩展类“MyJniClass”。