gpt4 book ai didi

c++ - JNA 程序函数查找失败

转载 作者:行者123 更新时间:2023-11-28 07:12:52 25 4
gpt4 key购买 nike

我是JNA编程新手,我想完成的任务是:

  1. C++ 库公开了将缓冲区“放入”文件和“查找”缓冲区的功能。我为这个库编译了一个共享对象 (.so),其头文件在“extern "C"” 下提供了函数定义,使其对 C 编译器友好。

  2. 测试 java 程序以访问缓冲区。

代码如下所示:

C/C++代码:

extern "C"
{
int get(int length, char *buffer);
}

#include <iostream>
#include <string.h>

int get(int length, char *buffer)
{
char *newBuff = new char[length];
for (int i = 0; i < length; ++i)
{
newBuff[i] = 'a';
}

memcpy(newBuff, buffer, length);
delete newBuffer;
return length;
}

java代码:

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

public class TestJna
{
public static interface TestNative extends Library
{
int get(int length, Memory buffer);
}
private static final TestNative lib_ = (TestNative)Native.loadLibrary("libsample.so", TestNative.class);
public static void main(String[] args)
{
int length = 1024;
Memory buffer = new Memory(length);
int ret = lib_.get(length, buffer);
System.out.println("ret:" + ret + ":buffer:" + buffer.toString());
}
}

在运行程序时,我在调用“lib.get()”方法时收到以下错误消息:

线程“main”中的异常 java.lang.UnsatisfiedLinkError:查找函数“get”时出错:dlsym(0x7f8d08d1e7d0,get):找不到符号

最佳答案

您导出的符号(根据 nm)被破坏了。除了声明之外,您还需要在函数定义之前添加 extern "C",即

extern "C" get(int length, char* buffer) {
...
}

您使用的第一个 extern "C" 语法通常用于头文件中的声明组。您还必须明确取消定义。

关于c++ - JNA 程序函数查找失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20712392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com