Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JNI问题构建.so文件_Java_C++_C_Linux_Java Native Interface - Fatal编程技术网

Java 使用JNI问题构建.so文件

Java 使用JNI问题构建.so文件,java,c++,c,linux,java-native-interface,Java,C++,C,Linux,Java Native Interface,我的密码和你的一模一样。事实上,我也有同样的问题。尝试使用两步方法解决问题,该方法运行以下操作: cc -c HelloWorld.c 然后执行下一个命令: cc -shared -o libHelloWorld.so HelloWorld.o 第一个命令运行find并创建HelloWorld.o,但是,在运行第二个命令后,出现以下错误: /usr/bin/ld: /tmp/ccA9BIT2.o: relocation R_X86_64_32 against `.rodata' can no

我的密码和你的一模一样。事实上,我也有同样的问题。尝试使用两步方法解决问题,该方法运行以下操作:

cc -c HelloWorld.c
然后执行下一个命令:

cc -shared -o libHelloWorld.so HelloWorld.o
第一个命令运行find并创建HelloWorld.o,但是,在运行第二个命令后,出现以下错误:

/usr/bin/ld: /tmp/ccA9BIT2.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC /tmp/ccA9BIT2.o: error adding symbols: Bad value collect2: error: ld returned 1 exit status
我正在运行ubuntu 16.04和JDK版本8


有什么想法吗?

如果您从JNI开始体验,最好从超级简单的示例开始,最好是“Hello world”。这样,您可以确保链中的所有元素都按预期工作

从简单类开始(最好将其放在包中):

您还需要本机代码本身。让它尽可能简单

#include <stdio.h>
#include "jni.h"

JNIEXPORT void JNICALL Java_recipeNo001_HelloWorld_displayMessage
  (JNIEnv *env, jclass obj) {

  printf("Hello world!\n");

}
-d
表示类将在目录
target

cc -g -shared -fpic -I${JAVA_HOME}/include \ 
  -I${JAVA_HOME}/include/$(ARCH) HelloWorld.c \
  -o lib/libHelloWorld.so
编译完所有内容后,您只需运行示例:

${JAVA_HOME}/bin/java \
  -Djava.library.path=${LD_LIBRARY_PATH}:./lib \
  -cp target recipeNo001.HelloWorld
请注意,我们正在使用
-cp
设置类路径,因为类文件是在
target
目录中生成的


就是这样:)你可以在这里找到更多的示例:

阅读错误消息,它说用-fPIC重新编译,所以编译它:
cc-c HelloWorld.c-o HelloWorld.o-fPIC
。在这里查看简单的“HelloWorld”示例。您可以在那里找到所有步骤——从源代码到编译再到执行。享受JNI带来的乐趣!:)非常感谢。我在找类似的东西。酷!享受JNI的乐趣!;)。哦。@Pablo:成功了。谢谢你!你什么时候会建议使用Swig而不是JNI?就个人而言,我不是Swig和JNA的粉丝。但是,如果您知道您将使用来自不同语言(例如Python,java)的相同代码,我会考虑使用它。不过,我没有多少经验。我更喜欢脏一点,非常明确,JNI。
cc -g -shared -fpic -I${JAVA_HOME}/include \ 
  -I${JAVA_HOME}/include/$(ARCH) HelloWorld.c \
  -o lib/libHelloWorld.so
${JAVA_HOME}/bin/java \
  -Djava.library.path=${LD_LIBRARY_PATH}:./lib \
  -cp target recipeNo001.HelloWorld