Java调用C++库文件例子

本文介绍如何在Mac OS上使用Eclipse和JNI技术,详细步骤包括创建Java工程,生成C++头文件,编写C++实现,编译生成动态库,并在Java中调用动态库方法,最终实现Java成功调用C++的加法函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java调用C++库文件例子

本例使用JNI(Java Native Interface)技术调用C++库文件
* 系统: Mac OS
* IDE: Eclipse

  • 创建Java工程命名为jniTest,新建一个类,名为MyDLL.java,代码如下:
public class MyDLL {
    static{
        System.loadLibrary("JavaCallCpp");
    }
    //定义一个native方法
    public native int addition(int a, int b);
}

eclipse保存后将在项目创建路径的bin目录下生成对应的.class文件

  • 进入.class文件所在目录,在命令行里输入 javah -cp /Users/chenliang/Works/Develop/MyProject/WorkSpace/jniTest/bin/ com.chen.jni.MyDLL,将在当前目录生成.class文件对应的.h文件(C++头文件). *注意:-cp后的路径和类名(类名前必须包含包名)*
  • 在相同目录下创建.cpp文件,命名为MyDLL.cpp,代码如下:
#include "com_chen_jni_MyDLL.h"

JNIEXPORT jint JNICALL Java_com_chen_jni_MyDLL_addition(JNIEnv *env, jobject object, jint a, jint b){
    return a + b;
}
  • 命令行在当前目录输入 g++ -I /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/include -I /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/include/darwin -shared -o JavaCallCpp.dylib JavaCallCpp.cpp ,两个 -I 是指定JDK目录下的jni.h和jni_md.h文件路径, -shared 为生成共享库, -o 为指定库文件名为MyDLL.dylib(Mac OS下为 lib文件名.dylib,Windows下为 文件名.dll,linux下为 文件名.so).

  • 将MyDLL.dylib文件拷贝到jniTest java工程根目录下,并新建一个类,名为test.java,代码如下:

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyDLL mydll = new MyDLL();
        //打印出3和4相加的结果
        System.out.println(mydll.addition(3, 4));
    }

}
  • 在eclipse里右键点击jniTest工程,选择 Build Path - Configure Build Path... - 展开 JRE System Library - Native library location ,点击右边的 Edit... ,将dylib文件路径输入
  • 运行Test,显示结果为7,调用动态库中的addition方法成功!
### Java 调用 C++ 动态库的方式 Java 可以通过多种方式调用C++编写的动态链接库,其中最常用的是JNI (Java Native Interface),其次是JNA (Java Native Access) 和 JNative。 #### JNI 方式简介 JNI 是一种标准机制,允许Java代码和其他语言(如C或C++)之间互相通信。这种方式通常涉及更多的手动编码工作,因为开发者需要创建桥接代码来连接JavaC++环境[^1]。 #### 使用JNI的具体流程如下: - 编译该Java文件得到`.class`文件; - 利用javah工具生成对应的头文件; - 实现这些原生函数,在此过程中可能还需要额外定义一些辅助性的全局变量或静态成员; - 将上述实现打包成共享库形式(Linux下为.so, Windows下为.dll),供后续加载使用; 下面给出一段简单的例子展示如何利用JNI从Java调用C++函数: ```cpp // 假设这是我们的C++源码部分 "example.cpp" #include <jni.h> #include <string> extern "C" { JNIEXPORT jstring JNICALL Java_com_example_MyClass_sayHello(JNIEnv* env, jobject obj){ std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); } } ``` 相应的Java端代码可能是这样的: ```java package com.example; public class MyClass { static{ System.loadLibrary("example"); // 加载名为 example 的so/dll 文件 } public native String sayHello(); public static void main(String[] args){ new MyClass().sayHello(); } } ``` 这段代码展示了基本的JNI交互模式——即在一个普通的Java应用程序里引入外部资源,并执行特定操作[^4]。 #### JNA 方法概述 相比之下,如果不想经历繁琐的手动绑定过程,则可以选择更简便的选择—JNA。它不需要修改任何底层平台上的二进制文件就能完成跨语言互访的任务。只需要按照官方文档指示配置好依赖关系即可快速上手[^2]。 对于希望减少开发复杂度而又不失灵活性的应用场景来说,采用JNA无疑是一个明智之举。不过需要注意的是,尽管其简化了很多步骤,但在性能方面可能会稍逊于直接运用JNI的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值