我是一位Java开发人员,几乎没有本机编码经验,所以我想创建我的第一个Java-Native-Interface演示。我正在尝试以与this example相同的方式使用Kotlin和C ++。我正在OS X上进行开发。
我陷入了从我的c ++文件编译动态库(.so文件)的步骤中。
jni/
文件夹中要启动的2个文件是:
我试图建立.so文件的步骤是:
1。 g++ -g jni/matt_extend_NativeTest.h -I "/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/include" -I "/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/include/darwin" -o jni/matt_extend_NativeTest.o
2。 g++ -g -I "/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/include" -I "/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/include/linux" -shared -o jni/libnativetest.so jni/matt_extend_NativeTest.o
ld: warning: ignoring file jni/matt_extend_NativeTest.o, file was built for unsupported file format ( 0x43 0x50 0x43 0x48 0x01 0x08 0x00 0x00 0xAE 0x0A 0x00 0x00 0x07 0xC1 0xB3 0xD0 ) which is not the architecture being linked (x86_64): jni/matt_extend_NativeTest.o
在步骤1中生成.o文件的正确方法是什么,以便在步骤2中不会收到警告?
答案 0 :(得分:2)
第一个命令有两个错误:
在编译jni/matt_extend_NativeTestImp.cpp
文件而不是.cpp
.h
而不是-c
对编译器使用附加的-fpic
标志,以便它生成目标文件(而不是可执行文件)
注意:您可能还需要使用jobs
选项(以生成与位置无关的代码)。
(使用当前错误的选项,g ++会生成预编译的头文件而不是目标文件)