Scala:在特征中使用JNI本机方法

时间:2014-02-21 14:09:55

标签: scala java-native-interface traits

我有一个类成功使用了许多JNI方法。但是,我想将其更改为特征,我无法获得C ++文件的正确功能签名。 Scalac编译器为特征生成一个与该类同名的类文件。当我在这个类文件上运行javah时,它给了我与类相同的c函数签名但是这些签名给了我:

方法xOpen在类pXClient / XCClass中有非法修饰符:0x501

原始类为xlib库提供了方法,但是我希望在Xlib和opengl之上在xcb和xcb之上提供Opengl的替代方案。以后的组合可以是Windows客户端上的Wayland或Opengl。因此,需要将这些方法分解为可混合的特征。

1 个答案:

答案 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”。