【问题标题】:Scala: using JNI native methods in traitsScala:在特征中使用 JNI 本机方法
【发布时间】:2014-03-23 02:30:48
【问题描述】:

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

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

原始类为 xlib 库提供方法,但我希望在 Xlib 之上为 Opengl 提供替代方案,在 xcb 之上提供 opengl 以及仅 xcb。以后的组合可能适用于 Windows 客户端上的 Wayland 或 Opengl。所以方法需要分解成可以混入的特征。

【问题讨论】:

    标签: scala java-native-interface traits


    【解决方案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 可以扩展一个类,使其抽象,无需构造函数:

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

    请注意,这相当于(或多或少):

    trait MyExtention{
      self: MyJniClass =>
    }
    

    这是一个自我类型或约束,表示您正在使用的类必须扩展类“MyJniClass”。

    【讨论】:

    • 这并不能解决我的问题。我希望能够将 jni 方法与其他类混合。
    • 您将不得不使用合成或使用委托。我会更新的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多