Java通过jna调用c++动态库

1、pom文件添加jna依赖

          <dependency>
                <groupId>net.java.dev.jna</groupId>
                <artifactId>jna</artifactId>
                <version>5.14.0</version>
            </dependency>

2、注意问题

要实现Java调用C++的动态库,需要使用"extern C"关键字。该关键字是C++之父在设计C++时,为兼容已存在的大量C代码而设定的方法。用该关键字将C++的函数包含起来,即可将C++按C语言的方式进行编译。

3、验证环节  没有extern C的c++文件  文件名 cplus2.cpp

#include<stdio.h>
int sayCplus()
{
    printf("Hello, C++\n");
    return 0;
}

4、c++代码头文件    文件名cplus.h

#ifndef _CPLUS_H_
#define _CPLUS_H_

int sayCplus();

#endif

5、g++编译代码 cplus.h和cplus2.cpp需在同一个文件夹下

g++ -shared -o mycpp2.dll cplus2.cpp

生成动态库 mycpp2.dll文件,吧该文件放到 C:\Windows\System32 目录下

6、java代码调用, mycpp2.dll 动态库加载  

package com.pojo.util;


import com.sun.jna.Library;
import com.sun.jna.Native;

public interface MyCpp2 extends Library {
    // 加载mycpp2.dll
    MyCpp2 INSTANCE = (MyCpp2) Native.load("mycpp2", MyCpp2.class);

    int sayCplus();

}

具体调用 和报错信息

package com.pojo.util;

public class MyCppTest {

    public static void main(String[] args) {
//        int num = MyCpp.INSTANCE.sayCplus();
//        System.out.println(num);
        int num2 = MyCpp2.INSTANCE.sayCplus();
        System.out.println(num2);

    }
}

报错信息

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'sayCplus': 找不到指定的程序。

7、正确做法 c++代码添加  extern "C" 修改如下 文件cplus.cpp 如下

#include<stdio.h>
extern "C"
{
int sayCplus()
{
    printf("Hello, C++\n");
    return 0;
}
}

8、cplus.h文件内容不变

9、编译成 mycpp.dll动态库

g++ -shared -o mycpp.dll cplus.cpp

生成动态库 mycpp.dll文件,吧该文件放到 C:\Windows\System32 目录下

10、java代码调用,动态加载 mycpp.dll

package com.pojo.util;


import com.sun.jna.Library;
import com.sun.jna.Native;

public interface MyCpp extends Library {
    // 加载 mycpp.dll
    MyCpp INSTANCE = (MyCpp) Native.load("mycpp", MyCpp.class);

    int sayCplus();

}

具体调用和调用结果

package com.pojo.util;

public class MyCppTest {

    public static void main(String[] args) {
        int num = MyCpp.INSTANCE.sayCplus();
        System.out.println(num);
//        int num2 = MyCpp2.INSTANCE.sayCplus();
//        System.out.println(num2);

    }
}

猜你喜欢

转载自blog.csdn.net/zsj777/article/details/142104417