繁体   English   中英

如何在C中实现Java接口方法

[英]How to implement Java Interface methods in C

我们来看下面的代码

public class SomeClass {

  public OtherClass method(final String param1,final String param2){
    AnotherClass obj1 = AnotherClass.getInstance();
    return obj.instanceMethod(new YetAnotherClass<OtherClass>() {
      @Override
      public OtherClass run() {
        return OtherClass.get(param1, param2);
      }
    });
  }
}

我的问题是,我可以通过JNI在C / C ++中实现接口,而无需在Java中创建本机方法吗?

一个选项是Java Native Access(JNA)库。 看看JNA的项目页面。 我引用其项目网站:

JNA为Java程序提供了对本机共享库的轻松访问,而无需编写除Java代码之外的任何内容 - 不需要JNI或本机代码。 此功能可与Windows的Platform / Invoke和Python的ctypes相媲美。

项目的总结页面中的以下示例演示了如何使用它从定义函数的本机库中调用printf函数:

package com.sun.jna.examples;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

 /** Simple example of JNA interface mapping and usage. */
public class HelloWorld {

// This is the standard, stable way of mapping, which supports extensive
// customization and mapping of Java to native types.

public interface CLibrary extends Library {
    CLibrary INSTANCE = (CLibrary)
        Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
                           CLibrary.class);

    void printf(String format, Object... args);
}

public static void main(String[] args) {
    CLibrary.INSTANCE.printf("Hello, World\n");
    for (int i=0;i < args.length;i++) {
        CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
    }
}

}

在Windows上, printf函数在msvcrt.dll定义,示例加载该DLL并从中调用该函数。

JNA项目已经成熟,根据其网页,它有一些非常着名的用户。

应该指出的是,JNA本身使用了引擎盖下的JNI,但在大多数情况下,您不需要自己使用JNI。 因此,您可以专注于在C中实现本机代码(创建自己的DLL或共享库文件),然后使用JNA在Java中加载它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM