gpt4 book ai didi

Java JNI 符号查找错误

转载 作者:行者123 更新时间:2023-11-28 05:59:22 24 4
gpt4 key购买 nike

首先,我是 JNI 新手。我有一个导入 native 函数的 java 类,这里是 Java 代码:

public static native byte[] sha512(byte[] message);
static {
System.loadLibrary("sha512");
}

当我尝试在 java 中调用函数时出现以下错误:

java: symbol lookup error: /home/kgb/IdeaProjects/JavaCiphersLib/out/production/JavaCiphersLib/libsha512.so: undefined symbol: _Znam

这是使用 javah 生成的 C++ 头文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class my_SHA512 */

#ifndef _Included_my_SHA512
#define _Included_my_SHA512
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: my_SHA512
* Method: sha512
* Signature: ([B)[B
*/
JNIEXPORT jbyteArray JNICALL Java_my_SHA512_sha512
(JNIEnv *, jclass, jbyteArray);

#ifdef __cplusplus
}
#endif
#endif

这里是实现:

#include <jni.h>
#include "my_SHA512.h"
#include <stdio.h>
#include <stdlib.h>

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jbyteArray JNICALL Java_my_SHA512_sha512(JNIEnv* env, jclass _class, jbyteArray message)
{
unsigned char* msg = new unsigned char[5];
delete msg;

printf("Test Test Test\n");
return message;
}

#ifdef __cplusplus
}
#endif

现在,如果我删除 unsigned char* msg = new unsigned char[5]; 行,错误就消失了。以下是 c++filt 的内容:

kgb@KGB-PC:~$ c++filt -n _Znam
operator new[](unsigned long)

以下是我编译 C++ 代码的方式:

gcc -I$JAVA_INC_PATH -I$JAVA_INC_PATH./linux -fPIC -c my_SHA512Impl.cpp
gcc -shared -Wl,-soname,libsha512.so.2 -o libsha512.so.2.0 my_SHA512Impl.o

那么我该如何摆脱这个错误呢?如果您对所有 c++ 魔法如何工作以及将来如何避免此类错误给出一些解释,那就太好了。
提前致谢。

UPD不知道它是否有用,但这是 ldd libsha512.so 输出:

linux-vdso.so.1 =>  (0x00007ffd29171000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0e1cd86000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0e1d34d000)

最佳答案

有时简单地使用 g++ 而不是 gcc 会有所帮助,因为它默认添加了 C++ 运行时库。

关于Java JNI 符号查找错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33577071/

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