Прежде всего, я новичок в JNI. У меня есть класс Java, который импортирует родную функцию, вот Java
код:Ошибка поиска Java JNI-символов
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
Вот C++
заголовок файла, который генерируется используя javah
:
/* 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
:
[email protected]:~$ 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 ** –
Вау, это помогло! Благодаря! Пожалуйста, подумайте над ответом. – Timofey