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