Java 编译JNI的麻烦
我通过引用已经使用JNI生成的头文件实现了以下C代码:Java 编译JNI的麻烦,java,c,linux,gcc,java-native-interface,Java,C,Linux,Gcc,Java Native Interface,我通过引用已经使用JNI生成的头文件实现了以下C代码: #include <jni.h> #include <stdio.h> #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj) { printf("Hello World!\n"); return; } 我得到了这个错误: /usr/lib/gcc/i686-
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
我得到了这个错误:
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
如何解决此问题?您需要添加主功能。加
int main(){
return 0;
}
,或者intmain(char*argv[],intargc)
您必须添加链接器选项
首先创建对象文件:
cc -c HelloWorld.c
然后创建so
cc -shared -o libHelloWorld.so HelloWorld.o
创建so文件有两个步骤:
cc -c test.c
cc -shared test.o -o test.so
查看详细信息。插入-shared标志
gcc -I/usr/lib/jvm/default-java/include -I/usr/lib/jvm/default-java/include/linux -o libmyhello.so -shared HelloWorld.c
这是一个图书馆;您不需要main函数。我与OP有相同的错误。我成功地运行了第一个命令,但是,在运行了第二个命令之后,我得到了以下信息:/usr/bin/ld:HelloWorld.o:relocation R_X86_64_32,针对“.rodata”创建共享对象时不能使用它;使用-fPIC HelloWorld.o重新编译:添加符号时出错:错误值集合2:错误:ld返回1退出状态有什么想法吗?@hadis您可能需要按照错误提示使用-fPIC进行编译
gcc -I/usr/lib/jvm/default-java/include -I/usr/lib/jvm/default-java/include/linux -o libmyhello.so -shared HelloWorld.c