如何从Java调用C++?

41

我想从Java中调用一个C++方法。我了解了JNI,但我不知道如何获取所有的库文件以及应该将它们放在哪里,以便从命令行运行程序。

是否有办法在Eclipse中直接调用C++方法,因为我正在使用它来运行Java类。


看一下这个线程 - https://dev59.com/M2w05IYBdhLWcg3wfh2g#7213943 - KV Prajapati
1
只需跟随任何JNI教程并开始即可。 - Gregory Pakosz
可能是重复的问题,参考如何使用NDK?从“hello world”应用程序开始 - Ciro Santilli OurBigBook.com
8个回答

9

虽然我之前在一些项目中使用过JNI-C++桥接,但有时候它看起来会有点丑陋。你可以考虑使用SWIG来帮助你生成所有复杂的样板代码。


7
如果JNI太复杂,您可以查看JNA。在第一种情况下,您需要创建本地包装器代码(使用C或C ++),将Java和本地(C ++ / C / ...)代码连接起来。在第二种情况下,它是在运行时完成的(因此您只需要Java代码+配置)。

"JNI"是标准答案。但如果JNA符合您的需求-很棒!@Fernando Miguelez:好建议!感谢分享!这里还有另一个链接:http://www.javaworld.com/javaworld/jw-02-2008/jw-02-opensourcejava-jna.html - paulsm4

5
我使用 JNR/FFI(链接:https://github.com/jnr/jnr-ffi),我发现它比 JNA 更快,比 SWIG 更容易。就速度而言,这是我所找到的最接近 JNI 的方式,但出错几率更小。

1
顺便提一下,JavaCPP的速度和JNR一样快。当我用它对Panama运行一些基准测试时,甚至发现了在JDK 11中的性能回归:https://bugs.openjdk.java.net/browse/JDK-8210975 - Samuel Audet

4

我以前使用JNA处理过简单接口,它足够简单而优雅。但是建议如果有复杂的接口,则最好使用SWIG。

有一些很好的答案将SWIG与JNI和JNA进行了比较。虽然提问已经有一段时间了。

SWIG vs JNI and JNA


4

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

JavaCPP能够高效地在Java内部访问本地C++。在底层,它使用JNI,因此可以与所有Java SE的实现一起使用。

比JNA/JNI更容易使用。


4

从Java程序中调用C++代码。

按以下步骤操作

  1. 编写Java代码
    • 包含本地方法声明
    • 加载包含本地代码的共享库
    • 调用本地方法
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代码

javac Sample2.java

  1. 创建C++头文件

javac Sample2.java

  1. 编写C++代码
#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++代码

cc -G Sample1.c -o Sample1.so

  1. 运行Java程序

java Sample1


1

为什么不使用JNI? - Gaurav

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接