Java 编译JNI的麻烦

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-

我通过引用已经使用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-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