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

UnsatisfiedLinkError:找不到指定的过程

马清野
2023-03-14

我试图开发一个C++DLL的JNA包装器。

在com.sun.jna.function.(function.java:252),在com.sun.jna.nativelibrary.getfunction(nativelibrary.java:600),在com.sun.jna.nativelibrary.getfunction(nativelibrary.java:576),在com.sun.jna.nativelibrary.getfunction(nativelibrary.java:562),在com.sun.jna.nativelibrary.java:562),在

查看我的cpp*.h文件

#ifdef __cplusplus

extern "C" {

#endif

typedef struct s_mine
{
    e_color           color;    //e_color is enum type made of int values
    his               data;        
    int               str;        
    unsigned int      wild;         
    unsigned int      hello;        
    float             rice; 
} mine;

typedef struct s_his
{
    unsigned char * data; 
    unsigned int    size;
} his;

// compute function which raised the exception

int compute(const his* const input, void ** outputPointer);

// treat function raised also the same exception

int treat(const mine* inputParameter, mine* outputParameter);

#ifdef __cplusplus

}

#endif

请参见下面我的JNA包装器:

public interface MyInterface extends Library {

    @FieldOrder({"data", "size"})
    public static class his extends Structure {
        public static class ByReference extends his implements Structure.ByReference {}
        public static class ByValue extends rt_buffer implements Structure.ByValue {}
        public Pointer data;
        public int size;
    }

    @FieldOrder({"color","data","str","wild","hello","rice"})
    public class mine extends Structure {
        public static class ByReference extends mine implements Structure.ByReference {}
        public int color; 
        public his data;
        public int str; 
        public int wild; 
        public int hello; 
        public float rice;
    }

    public int compute(his input, Pointer[] outputPointer);

    public int treat(mine inputParameter, mine outputParameter);
}

因此,在我的测试类中,我设置:

// COMPUTE

MyInterface.his.ByReference input_ref = new MyInterface.his.ByReference();

ByteBuffer init_buffer;

// init_buffer is initialized with some not null values

Pointer init_p = Native.getDirectBufferPointer(init_buffer);

input_ref.data = init_p;

input_ref.size = init_buffer.capacity();

Pointer[] outputPointer = null;

int resultCompute = compute(input_ref, outputPointer);

// TREAT

MyInterface.mine.ByReference inputParameter_ref = new MyInterface.mine.ByReference();

MyInterface.his.ByValue buffer = new MyInterface.his.ByValue();

// initialize buffer with an input buffer value different from null value

// Set other fields of inputParameter_ref with none null values

inputParameter_ref.data = buffer;

MyInterface.mine.ByReference outputParameter_ref = null;

int resultTreat = treat(inputParameter_ref, outputParameter_ref);

因此,我感觉引发的异常不是来自我的实现,而是来自DLL。但我没有任何线索来解释为什么关于我的断言在我的帖子开始。

>

  • 除了装饰和外部声明问题,还有其他原因吗?

    因此,我在jna包装器中有:

    公共int计算(他的输入,指针[]outputPointer);公共int管理(指针inputPointer);

    在我的测试类中,我有:

    在我的测试类中,我有:

    PointerByReference outputPointer=null;

    int resultCompute=myinterface.compute(input_ref,outputPointer);

    上面的sysout显示被调用的当前方法的名称,即显示method names=compute。调试代码时,我注意到它们是方法名称上的一个问题。但是由于sysout显示了我在jna包装器中声明的方法的名称,所以没有帮助。我刚刚用一个C++dll中没有定义的假方法执行了一个快速测试,我遇到了同样的错误:找不到过程。因此,我真的认为dll有一个问题,但我不知道如何找到它...

  • 共有1个答案

    阎咏思
    2023-03-14

    最后,我不得不在调用包装器的java测试主类中添加以下一行来解决我的问题:System.SetProperty(“jna.library.path”,“C:\mywrapper\src\main\resources);其中C:\mywrapper\src\main\resources是存储dll文件的文件夹。

    但是它没有解释为什么我不需要为存储在同一个文件夹中的其他dll设置这一行,因为我也在环境变量中声明了jna.library.path。

     类似资料:
    • 问题内容: 我正在用C ++编写一些JNI代码,以便从Windows XP的applet中调用。我已经能够成功运行applet并加载和调用JNI库,甚至可以在其他DLL中调用它。我通过设置PATH系统环境变量来使其工作,以包括所有DLL所在的目录。 因此,问题在于,我添加了另一个使用新的外部DLL的调用,并且突然在加载库时引发UnsatisfiedLinkError。消息为:“找不到指定的过程”。

    • 我试图打印TSC-244 Pro条形码标签打印机从GWT网络应用程序。他们给出tsclib.dll。因此,我使用jna.jar并将tsclib.dll文件复制到C:\windows和[my_project_dir]\war\WEB-INF\lib。它的工作,但当我部署到apache Tomcat。它不工作,我有以下错误。请给我解决办法。谢谢。 严重:分派传入的RPC调用com.google.gwt

    • 我正在尝试使用可视化工作室创建一个dll文件,并在java项目中使用/访问它。库似乎被加载了,但总是抛出相同的异常:线程“主”java.lang.中的异常不满意链接错误:查找函数“函数”时出错:找不到指定的过程。我的C / C技能不是最好的,所以问题可能就在那里。我试图编辑h和cpp文件,使用类,命名空间,静态方法和在网络上找到的其他人员,但无所事事。我也看到其他帖子谈论Depency Walke

    • 使用OracleDB时出错,错误为“找不到指定的过程”。节点安装OracleDB正常。为构建而执行的步骤如下 已安装Visual Studio 2017 Visual C 14.0 使用/app.js内容运行代码时出错 使用strongloop/loopback CLI时出现相同错误。任何指示都会有帮助

    • 问题内容: 有一块代码可以在android 4.1.2上正常工作,但在4.0.3上却不能正常工作,崩溃日志为4.0.3 我收到UnsatisfiedLinkError异常 请指导我谢谢 这是我的课 这是我从中编译并创建二进制“ libsqliteX.so”文件的源cpp文件http://www.sqlite.org/android/tree?ci=trunk&re=jni|src/org/sqli

    • 问题内容: 我已经开始使用Python处理图片,并且想开始使用PIL(枕头)。要安装它,我跑了。安装时,以前未安装PIL。我还尝试卸载并重新安装它,以及使用。 当我在Python中运行它时,第一行是: 我检查了目录,并且PIL文件夹下存在文件_imaging.cp36-win_amd64.pyd。 如果存在所需的DLL,为什么会发生这种情况?我该如何解决? 问题答案: 我在Python 3.6中也