1

I wrote C++ code for JNI then built shared library. This shared lib is using NTL static library. But it gets following error.

Compiler configuration and error (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
Maxr
  • 45
  • 4

1 Answers1

4

Because you use -fPIC flag for your shared library, you need to recompile NTL with -fPIC flag too.

nadro
  • 78
  • 1
  • 4
  • @Maxr I mean that you need to recompile `/usr/local/lib/libntl.a` with -fPIC. You don't show how you compiled libntl.a library. – nadro Jan 03 '17 at 09:40
  • OK I see, let me try this ty:) – Maxr Jan 03 '17 at 09:45
  • Yes, your solution solved my problem. In addition, NTL uses GMP library, so this flag also needed to compile GMP. Thank you – Maxr Jan 06 '17 at 13:43
  • @Maxr If my solution solved your problem please accept my answer. – nadro Jan 11 '17 at 13:05