如何从Java调用C ++?

时间:2011-09-29 06:30:32

标签: java c++ xml java-native-interface

我想从Java调用C ++方法。我读到了JNI,但我没有得到如何获取所有库文件以及我应该保留它以便从命令行运行程序。

有没有办法从Eclipse本身调用C ++方法,因为我用它来运行Java类。

8 个答案:

答案 0 :(得分:6)

如果JNI过于复杂,您可以查看JNA。在第一种情况下,您必须创建本机包装器代码(在C或C ++中)以加入Java和本机(C ++ / C / ...)代码。在第二种情况下,它在运行时完成(因此您只需要Java代码+配置)。

答案 1 :(得分:6)

虽然我过去使用过JNI-C ++桥接(虽然只是一点点) - 但它可能有点难看。您可能需要考虑使用SWIG来帮助您生成所有混乱的样板代码。

答案 2 :(得分:2)

之前我使用过JNA来获得简单的界面,它简单而优雅。但是,建议如果有复杂的界面,那么最好使用SWIG。

有一些很好的答案可以比较SWIG与JNI和JNA。现在问了一段时间,这已经有一段时间了。

SWIG vs JNI and JNA

答案 3 :(得分:1)

可以使用

JNA 代替JNI。

您只需要下载 JNA jar https://github.com/java-native-access/jna#download ),这应该包含在您的Java项目中。

您需要在项目属性中提供c ++库的位置。

  • 右键单击项目
  • 生成
  • 在VM选项中包含此 -Djava.library.path =" C:您的dll 位置"

访问此站点以获取一个示例,该示例还包含Java和c ++项目的源代码,以了解其工作原理。 ( http://blog.mwrobel.eu/how-to-call-dll-methods-from-java/#a_downloads

答案 4 :(得分:1)

JavaCPP - https://github.com/bytedeco/javacpp

它提供了对Java内部本机C ++的高效访问。在引擎盖下,它使用JNI,因此它适用于Java SE的所有实现。

比JNA / JNI容易得多

答案 5 :(得分:1)

我使用JNR / FFI https://github.com/jnr/jnr-ffi,发现它比JNA更快,比SWIG容易。就我发现的速度而言,它与JNI十分接近,但是出错的可能性较小。

答案 6 :(得分:0)

How to call a C/C++ function from Java then you can use
Java Native Interface (JNI), part of the Java platform, is an interface that enables communication 
between Java applications running on a Java Virtual Machine (JVM) and native applications or libraries
written in other programming languages (e.g. C, C++).
you can use some below urls for as examples.
http://malinsky.eu/blog/how-to-call-a-c-function-from-java/
https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

答案 7 :(得分:0)

从Java程序调用c ++代码。

按照下面的步骤

  
      
  1. 编写Java代码      
        
    • 该原生方法的contian声明
    •   
    • 加载共享库包含本机代码
    •   
    • 调用本地方法
    •   
  2.   
public class Sample1 
{
     public native int intMethod(int n);
     public static void main(String[] args)
     {
          System.loadLibrary("Sample1");
          Sample1 sample = new Sample1();
          int     square = sample.intMethod(5);
          System.out.println("intMethod: " + square);
     }
}
  
      
  1. 编译Java代码
  2.   

javac Sample2.java

  
      
  1. 创建c ++头文件
  2.   

javac Sample2.java

  
      
  1. 编写c ++代码
  2.   
#include "Sample1.h"
#include <string.h>

JNIEXPORT jint JNICALL Java_Sample1_intMethod
  (JNIEnv *env, jobject obj, jint num) {
   return num * num;
}

void main(){}
  
      
  1. 编译c ++代码
  2.   

cc -G Sample1.c -o Sample1.so

  
      
  1. 运行Java程序
  2.   

java Sample1