关于JAVA调用C++的几种方式和一些问题 UnsatisfiedLinkError

本文介绍通过JNA实现Java调用C++的具体方法,包括示例代码、常见错误及解决办法。

关于JAVA调用C++的几种方式和一些问题

java调用c++有几种方式,1.JNA方式,2,JNative 方式,3.JNI 方式。:

1.JNA方式

public interface MyCLibrary extends Library {  
    MyCLibrary INSTANCE =(MyCLibrary)Native.loadLibrary("Image",  MyCLibrary.class);  
     WString  Preprocess( WString inputStr);
     int add(int a,int b);

}

Image.dll 位于src 根目录下

这里写图片描述

然后在MainFrame中处理

    public static void main(String[] args) {
        MainFrame frame = new MainFrame();
        frame.setVisible(true);
        //WString  可以传中文
        WString wPStr = new WString("123qqq你好");
        WString newPStr = (WString)MyCLibrary .INSTANCE.Preprocess(wPStr);
        System.out.println("newPath =="+newPStr );

        int result = MyCLibrary.INSTANCE.add(3,5);
        System.out.println("result =="+result);
    }

下面是生成DLL的C++程序代码:


#include "stdafx.h"  

extern "C"  __declspec(dllexport)   wchar_t* Preprocess(wchar_t* inputStr) ;
extern "C"  __declspec(dllexport)   int add(int a, int b);

wchar_t* Preprocess(wchar_t* inputStr) {
    return inputStr;
}

int add(int a, int b) {
    return a + b;
}
wchar_t* 对应java中的WString
MyCLibrary 的函数
     WString  Preprocess( WString inputStr);
     int add(int a,int b);
和C++ 的函数 对应
    wchar_t* Preprocess(wchar_t* inputStr) {
    return inputStr;
    }

    int add(int a, int b) {
        return a + b;
    }

最后java的main函数调用即可,返回结果为8

int result = MyCLibrary.INSTANCE.add(3,5);

JNA jar包下载,csdn上传资源最少2分 没办法 http://download.csdn.net/download/lyfls/10157058

常见错误

1.声明函数一定要是 extern “C” __declspec(dllexport) 不然会报错 Exception in thread “main” java.lang.UnsatisfiedLinkError: Error looking up function ‘Preprocess’: 找不到指定的程序。
2.Exception in thread “main” java.lang.UnsatisfiedLinkError: 找不到指定的模块 .C++生成DLL版本的问题,升级vs版本2010 到2015

注意:如果一直报错误Error looking up function ‘Preprocess’: 找不到指定的程序。 进行如下操作:

1.建立一个新的C++的DLL工程 :使用默认的

include “stdafx.h”

2.再复制下面语句,不要包含头文件:

extern "C"  __declspec(dllexport)   wchar_t* Preprocess(wchar_t* inputStr) ;
extern "C"  __declspec(dllexport)   int add(int a, int b);

wchar_t* Preprocess(wchar_t* inputStr) {
    return inputStr;
}

int add(int a, int b) {
    return a + b;
}

估计是VS的bug问题

3.如果报错为 Exception in thread “main” java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。,请注意你的C++编译版本要和JDK的编译版本一致,一般情况下要么需要编译32位的,要么是64位的

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值