2017-01-03 2 views
1

JNI 용 C++ 코드를 작성한 후 공유 라이브러리를 빌드했습니다. 이 공유 라이브러리는 NTL 정적 라이브러리를 사용합니다. 하지만 다음과 같은 오류가 발생합니다.정적 NTL 라이브러리를 사용하여 JNI 빌드 공유 라이브러리

컴파일러 구성 및 오류 (넷빈즈) :

g++ -c -O2 -s -I/usr/lib/jvm/default-java/include -I/usr/lib/jvm/default-java/include/linux  
-I/usr/local/include/NTL -fPIC -MMD -MP -MF "build/Debug/GNU-Linux/ntl4java.o.d" 
-o build/Debug/GNU-Linux/ntl4java.o ntl4java.cpp 
mkdir -p dist/Debug/GNU-Linux 
g++  -o dist/Debug/GNU-Linux/libntl4java.so build/Debug/GNU-Linux/ntl4java.o -lgmp -lntl 
-shared -s -fPIC 
/usr/bin/ld: //usr/local/lib/libntl.a(lip.o): relocation R_X86_64_32 against .rodata.str1.1' 
can not be used when making a shared object; recompile with -fPIC 
//usr/local/lib/libntl.a: error adding symbols: Bad value 

ntl4java.cpp

#include <NTLmethod.h> 
#include <NTL/ZZ_pX.h> 
#include <string.h> 

using namespace std; 
using namespace NTL; 

JNIEXPORT jstring JNICALL Java_NTLmethod_mult(JNIEnv *env, jclass obj, jstring input) { 
    const char *str = env->GetStringUTFChars(input, 0); 
    ZZ p; 
    char c[128]; 
    strcpy(c, str); 
    env->ReleaseStringUTFChars(input, str); 

    return env->NewStringUTF(c); 
} 
int main(){ 
    return 0; 
} 

NTLmethod.h

#include <jni.h> 

#ifndef _Included_NTLmethod 
#define _Included_NTLmethod 
#ifdef __cplusplus 
extern "C" { 
#endif 

JNIEXPORT jstring JNICALL Java_NTLmethod_mult(JNIEnv *, jclass, jstring); 

#ifdef __cplusplus 
} 
#endif 
#endif 

답변

3

당신이 공유 라이브러리에 대한 -fPIC 플래그를 사용하기 때문에, -fPIC 플래그로 NTL을 다시 컴파일해야합니다.

+0

Ok하자. – Maxr

+0

@Maxr 즉, ​​/ usr/local/lib/libntl.a를 -fPIC로 다시 컴파일해야한다는 의미입니다. libntl.a 라이브러리를 컴파일하는 방법을 보여주지는 않습니다. – nadro

+0

알겠습니다.이 타이를 보겠습니다. – Maxr