java - 如何在 OS X 上正确创建 C++ 对象文件 (.o)?

标签 java c++ java-native-interface

我是一名 Java 开发人员,几乎没有 native 编码经验,我想创建我的第一个 Java-Native-Interface 演示。我正在尝试以与 this example 相同的方式使用 Kotlin 和 C++ 来做到这一点.我正在 OS X 上开发。

我卡在了应该从我的 C++ 文件编译动态库(.so 文件)的步骤。

我的 jni/ 文件夹中要启动的 2 个文件是:

  • matt_extend_NativeTest.h
  • matt_extend_NativeTestImp.cpp

我尝试构建 .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

  • 这会生成 ma​​tt_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

  • 这会生成 libnativetest.so 但我收到警告:

ld:警告:忽略文件 jni/matt_extend_NativeTest.o,文件是为不受支持的文件格式构建的(0x43 0x50 0x43 0x48 0x01 0x08 0x00 0x00 0xAE 0x0A 0x00 0x00 0x07 0xC1 0xB3 0xD0),这不是被链接的架构(x86_64): jni/matt_extend_NativeTest.o

在第 1 步中生成 .o 文件的正确方法是什么,这样我就不会在第 2 步中收到警告?

最佳答案

第一条命令有两个错误:

  1. 在编译 .cpp 文件时,使用 jni/matt_extend_NativeTestImp.cpp 而不是 jni/matt_extend_NativeTest.h,不是 .h

  2. 对编译器使用额外的 -c 标志,因此它生成目标文件(而不是可执行文件)

注意:您可能还需要使用 -fpic 选项(以生成与位置无关的代码)。

(使用当前错误的选项,g++生成预编译头文件而不是目标文件)

关于java - 如何在 OS X 上正确创建 C++ 对象文件 (.o)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51715914/

相关文章:

java - 在 JNI 和 C 中释放持久数组

c++ - r-value ref 到 l-value ref 的转换,为什么有效?

c++ - 为什么 C++ 中函数指针返回的数据过期并且无法访问数组的所有元素?

c++ - 从 Visual Studio 应用程序移植到 Qt 应用程序

android - 在 Android 上使用 C/C++ 库

android - 用于android人脸识别的openCV显示 "mat not continuous"错误

java - 方法的 JNI 风格签名

java - 在 setContentView Java 之上实例化对象时出现范围错误

java - 使用 AWS API 网关 + lambda 函数 + RequestHandler

java - 需要帮助添加使用 system.exit(0) 的 JButton