「已注销」 2021-09-07 19:55 采纳率: 0%
浏览 1045

java调用c++ dll一直报Invalid memory access

想用java调用c#dll,各位,本来好好的,不知道为啥又不行了,一直报Invalid memory access,
不知道跟.net Net Framework 有没有关系,因为之前的c#dll是4.0的,后面改成4.7.2了 。各位兄弟姐妹救命!

java代码:

    static{
        //修改编码
        System.setProperty("jna.encoding", "GBK");
    }
    @Test
    void contextLoads()throws IOException {
        System.out.println(CLibrary.INSTANCE.GetOrder("123", "232", "13"));
         System.out.println(CLibrary.INSTANCE.GetParam(url, FactoryCode, "13","12","20","10","123"));
     
    }

    public interface CLibrary extends Library {
        // DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径 C:\Users\zhi\Desktop\dll\
        CLibrary INSTANCE = (CLibrary) Native.load( "C:\\Users\\zhi\\Desktop\\dll\\demo", CLibrary.class);
        // 声明将要调用的DLL中的方法(可以是多个方法)
        String GetOrder(String format, String  PASSWORD, String SHA1);
       String GetParam(String serverurl, String code, String line,
                        String specCode, String device, String proudct, String semproudct);
    }

c++:

#ifdef MYLIBAPI 
#else 
#define  MYLIBAPI  extern "C" __declspec(dllimport)     
#endif 

MYLIBAPI char* GetOrder(char* ServerUrl, char* FactoryCode, char* LineCode); //添加函数声明
MYLIBAPI char* GetParam(char* ServerUrl, char* FactoryCode, char* LineCode, char* SpecCode, char* DeviceCode, char* ProductItemNo, char* SemiProductItemNo);

#using "C:\\Users\\zhi\\Desktop\\dll\\MES.dll"
using namespace System;
using namespace MES;

char* GetOrder(char* ServerUrl, char* FactoryCode, char* LineCode)
{
    MESClient^ meh = gcnew MESClient();
    String^ url = gcnew String(ServerUrl);
    String^ code = gcnew String(FactoryCode);
    String^ line = gcnew String(LineCode);

    String^ resultstring = meh->GetOrder(url, code, line);
    char* result = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToCoTaskMemAnsi(resultstring);
    return result;
}
char* GetParam(char* ServerUrl, char* FactoryCode, char* LineCode, char* SpecCode, char* DeviceCode, char* ProductItemNo, char* SemiProductItemNo)
{
    MESClient^ meh = gcnew MESClient();
    String^ url = gcnew String(ServerUrl);
    String^ code = gcnew String(FactoryCode);
    String^ line = gcnew String(LineCode);
    String^ speccode = gcnew String(SpecCode);
    String^ device = gcnew String(DeviceCode);
    String^ product = gcnew String(ProductItemNo);
    String^ semproduct = gcnew String(SemiProductItemNo);

    String^ resultstring = meh->GetParam(url, code, line, speccode, device, product, semproduct);
    char* result = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToCoTaskMemAnsi(resultstring);
    return result;
}
  • 写回答

2条回答 默认 最新

  • Peter20150926 2023-03-07 15:35
    关注

    你好 如何解决的?

    评论

报告相同问题?

问题事件

  • 创建了问题 9月7日

悬赏问题

  • ¥50 求大神教题,这个代码和讲解思路都怎么写呀,完全卡住了
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?
  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument