基本上,我正在编写一个基准测试来测试各种语言的速度,而我要测试的语言之一是使用汇编语言的Java w / JNI,以避免重写代码,我使所有本机语言都使用一种通用语言库(benchlib.h),它由程序集,clang和gcc编译对象(例如benchlib.c.clang.o或benchlib.asm.o)代替,要使用CI加载这些对象,只需将它们链接进去,但是使用JNI您必须使用共享库,这样我才能像这样编译C代码。但是,当尝试将程序集链接到JNI共享库时,会出现我的问题。
这是编译过程:
#Assembly
nasm -f elf64 benchlib.asm -o benchlib.asm.o
#Clang and GCC
gcc -c benchlib.c -o benchlib.c.gcc.o -O3 -fpic
clang -c benchlib.c -o benchlib.c.clang.o -O3 -fpic
# Stuff happens here that im not showing, because its unrelated
javac bench_jni.java
javah bench_jni
echo "Compiling JNI bullshit"
dojni(){
gcc -c benchlibjni.c -o benchlibjni.o -O3 -fpic $jni_include
gcc benchlibjni.o $1 -shared -o $2 -O3
rm -v benchlibjni.o
}
dojni benchlib.c.gcc.o libbenchjni_gcc.so
dojni benchlib.c.clang.o libbenchjni_clang.so
dojni benchlib.asm.o libbenchjni_asm.so
这是头文件:
#ifndef __benchlib_h
#define __benchlib_h
extern int prime(int n); //Checks if a number is prime
extern void primes(int n, int* buf); // Fills the buffer with prime numbers
extern char* getName(); // Returns the name of the language and compiler used
#endif
这是从JNI到本机的转换:
JNIEXPORT void JNICALL Java_bench_1jni_primes(JNIEnv* env, jclass c, jint num, jintArray buf){
jsize len = (*env)->GetArrayLength(env, buf);
jint* dat = (*env)->GetIntArrayElements(env, buf, 0);
if(sizeof(jint) != sizeof(int)){
printf("Sizes not the same, end of world\n");
exit(-1);
}
primes(num, (int*) dat);
return;
}
JNIEXPORT jboolean JNICALL Java_bench_1jni_prime(JNIEnv* env, jclass c, jint num){
return prime((int) num);
}
JNIEXPORT jstring JNICALL Java_bench_1jni_getName(JNIEnv* env, jclass c){
return (*env)->NewStringUTF(env, getName());
}
如果您还有其他需要,可以在这里找到: http://github.com/abc123me/benchmarking/
GCC和Clang编译的C制作了一个快乐的共享对象文件,但是,当将汇编对象文件与已编译的JNI GCC本机-JNI链接器链接时(我知道已获得专利的技术说明),我收到一条错误消息,告诉我不允许使用.data节? (我还应该如何获得数据!):
/usr/bin/ld: benchlib.asm.o: relocation R_X86_64_32 against `.data' can not be used when making a shared object; recompile with -fPIC
benchlib.asm.o:添加符号时出错:错误的值 collect2:错误:ld返回1退出状态
我的.data节包含它(汇编语言)所用语言的名称。我无法使用-fPIC进行编译,因为NASM不支持
执行此命令时出现此错误:
gcc benchlibjni.o $1 -shared -o $2 -O3
其中1和2分别为benchlib.asm.o
libbenchjni_asm.so