2015-11-06 2 views
0

Прежде всего, я новичок в 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) 
+1

Иногда это помогает просто использовать ** g ++ ** вместо ** gcc ** –

+1

Вау, это помогло! Благодаря! Пожалуйста, подумайте над ответом. – Timofey

ответ

1

Это иногда помогает просто использовать г ++ вместо НКУ, потому что он добавляет ++ библиотеки времени выполнения C помощью по умолчанию.

Смежные вопросы