Java JNI符号查找错误

Java JNI symbol lookup error

本文关键字:错误 查找 符号 JNI Java      更新时间:2023-10-16

首先,我是JNI的新手。我有一个导入本机函数的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 Testn");
    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++运行库。