2016-11-17 83 views
1
的Java接口中的方法

讓我們以下面的代碼如何實現用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); 
     } 
    }); 
    } 
} 

我的問題是有,我可以實現C/C++通過JNI接口的任何方式,而無需創建Java中的本地方法?

回答

0

一個選項是Java Native Access(JNA)庫。看看它的項目頁面JNA。我從其項目網站引用:

JNA提供Java程序輕鬆訪問本地共享庫,而無需編寫任何Java代碼 - 無需JNI或本機代碼。該功能與Windows的平臺/調用和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中。