2

我正在尝试在 Java 代码中调用 C 函数。我有这个哈瓦代码。

public class JavaToC {

    public native void helloC();

    static {
        System.loadLibrary("HelloWorld");
    }

    public static void main(String[] args) {
        new JavaToC().helloC();
    }
}

. 我编译了它,然后创建了头文件。然后制作以下 HelloWorld.c 文件。

#include <stdio.h>
#include <jni.h>
#include "JavaToC.h"
JNIEXPORT void JNICALL Java_JavaToC_helloC(JNIEnv *env, jobject javaobj)
{
  printf("Hello World: From C");
  return;
}

我尝试使用“gcc -o libHelloWorld.so -shared -I/usr/java/include -I/usr/java/include/solaris HelloWorld.c -lc”来编译它,但它给出了以下结果。

Text relocation remains                     referenced
    against symbol          offset  in file
.rodata (section)                   0x9         /var/tmp//cc.GaGrd.o
printf                              0xe         /var/tmp//cc.GaGrd.o
ld: fatal: relocations remain against allocatable but non-writable sections
collect2: ld returned 1 exit status

我正在使用 Solaris 11,我该如何解决这个问题?

4

1 回答 1

6

我目前无法在 Solaris 机器上进行测试,但来自http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/SPARC-Options.html

-mimpure-text抑制“重定位仍然针对可分配但不可写的部分”链接器错误消息。但是,必要的重定位将触发写时复制,并且共享对象实际上并未跨进程共享。-mimpure-text您应该使用-fpic或编译所有源代码,而不是使用 -fPIC

解决方案似乎是添加-fpic选项以生成与位置无关的代码。

于 2013-09-15T13:48:27.673 回答