当前位置: 首页 > 知识库问答 >
问题:

如何用JNA正确调用这个DLL?exception_access_inversion

阙繁
2023-03-14
#ifdef __WIN32__
extern "C"{
  __declspec (dllexport) int __stdcall SpellInit(const char *path_dic, const char *path_volg);
  __declspec (dllexport) int __stdcall SpellTerminate(void **lista);
  __declspec (dllexport) LPSTR __stdcall SpellSuggestChar(const unsigned char *palabra);
  __declspec (dllexport) LPSTR SpellGetUdr(void);
  __declspec (dllexport) int SpellSetOptions(int option);
}
SpellInit
SpellTerminate
SpellSuggestChar
_SpellGetUdr@0
_SpellSetOptions@4

错误:由于隐式依赖模块中缺少导出函数,至少有一个模块具有未解析的导入。错误:发现具有不同CPU类型的模块。

但是这个DLL是从另一个运行良好的DLL派生出来的(尽管它是从VB代码调用的),但它也抛出了同样的两个错误。

最后,我是这样称呼它的:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
import java.util.HashMap;

public class Test_DLL {
  public interface ORTCLI extends StdCallLibrary {        
    ORTCLI INSTANCE = (ORTCLI) Native.loadLibrary("ORTCLI", ORTCLI.class, new HashMap(){{
        put("SpellGetUdr","_SpellGetUdr@0");
        put("SpellSetOptions","_SpellSetOptions@4");
    }});

    int SpellInit(String path_dic, String path_volg);
    String SpellSuggestChar(String pal);
    int SpellAddUdr(String pal);
    String SpellGetUdr();
    int SpellTerminate();
  }

共有1个答案

马弘和
2023-03-14

Technomage说得对,所有方法都应该声明为使用stdcall,而不是将方法与stdcall混合使用或不使用。但这只是问题的一半。

最后,解决方案来自更改SQLite编译选项,特别是-dThreadSafe参数。激活后一切都开始正常工作。

干杯。

 类似资料:
  • 线程“main”java.lang.UnsatifiedLinkError:查找函数“StartConector”时出错:找不到指定的过程。在com.sun.jna.function.(function.java:179)在com.sun.jna.nativelibrary.getfunction(nativelibrary.java:350)在com.sun.jna.nativelibrary.

  • 我从Ronak Shah和akrun(在本文中)那里学到了如何构造正则表达式,以从数据帧(在我的示例中为alldata)中排除除这些单词之外的所有术语, ^\B WORD 1|WORD 2|WORD 3|WORD 4|WORD 5\ 但出于某些原因,我不明白为什么它给了我 “WORD2”,“WORD3”,不适用 而不是 “WORD1 WORD2 WORD5”,“WORD3”,不适用 以下是我的示例

  • 我在使用JNA的java中使用dll,但我得到以下错误 线程“main”java中出现异常。lang.UnsatifiedLinkError:查找函数“GetStatus”时出错:找不到指定的过程。 不知道如何解决此问题? 请帮忙。 这是java代码

  • 问题内容: 我的代码有最后一个问题,涉及反射包中的.Call函数。 所以我在打这样的电话: 我正在执行.Call的方法如下: 我不太了解的是如何操作“ in”变量,以便将需要的映射正确传递到函数中。我看到make()中的第二个参数是参数的长度吗?但是我不太了解如何格式化var以正确传递参数。我递归地遇到错误消息: 任何帮助将非常感激! 问题答案: 来自: 呼叫调用函数与输入参数。例如,如果,代表去