JNI 使用静态 NTL 库构建共享库
JNI build shared library using static NTL library
我为 JNI 编写了 C++ 代码,然后构建了共享库。此共享库使用 NTL 静态库。但是出现以下错误。
编译器配置和错误 (Netbeans):
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
因为您对共享库使用了 -fPIC 标志,所以您也需要使用 -fPIC 标志重新编译 NTL。
我为 JNI 编写了 C++ 代码,然后构建了共享库。此共享库使用 NTL 静态库。但是出现以下错误。
编译器配置和错误 (Netbeans):
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
因为您对共享库使用了 -fPIC 标志,所以您也需要使用 -fPIC 标志重新编译 NTL。