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

时间:2016-11-17 05:57:29

标签: java c java-native-interface

我们采取以下代码

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中创建本机方法吗?

1 个答案:

答案 0 :(得分:0)

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

  

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

项目的toturial page中的以下示例演示了如何使用它来从定义函数的本机库中调用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中加载它们。