gpt4 book ai didi

java-native-interface - CMake JNI 错误

转载 作者:行者123 更新时间:2023-12-03 09:47:15 26 4
gpt4 key购买 nike

我编写了一个绑定(bind) C++ 类,它从 C++ 调用 java。我正在尝试使用 CMake 编译绑定(bind)类(因为将使用绑定(bind)类的工具使用 CMake)。

但是我收到以下错误:

CMakeFiles/JNIWrapper.dir/JNIWrapper.cpp.o: In function `createVM(JavaVM_**)':
JNIWrapper.cpp:(.text+0x52): undefined reference to `JNI_CreateJavaVM'
collect2: ld returned 1 exit status
make[2]: *** [JNIWrapper] Error 1
make[1]: *** [CMakeFiles/JNIWrapper.dir/all] Error 2
make: *** [all] Error 2

这是我的 CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.6)

project(AProject)

FIND_PACKAGE(JNI REQUIRED)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/lib/jvm/java-6-openjdk-amd64/include -I/usr/lib/jvm/java-6-openjdk-amd64/include/linux -L/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/server")

SET(CMAKE_EXE_LINKER_FLAGS "-ljvm")

# add the binary tree directory to the search path for include files
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${JNI_INCLUDE_DIRS})

# add the executable
add_executable (JNIWrapper JNIWrapper.cpp)

任何建议表示赞赏。

PS:我尝试使用传统方式和编写makefile来编译它。我按照该示例编写了上面的 CMakeLists.txt 脚本。

最佳答案

以下CMakeLists.txt概述了使用 CMake 构建示例 JNI 项目所需的步骤:

cmake_minimum_required (VERSION 3.0)

find_package(Java REQUIRED)
find_package(JNI REQUIRED)
include(UseJava)

enable_testing()
project (JNIFoo)

# compile JNIFoo.java to class file
set(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.6" "-target" "1.6")
add_jar(JNIFoo JNIFoo.java)
get_target_property(_jarFile JNIFoo JAR_FILE)
get_target_property(_classDir JNIFoo CLASSDIR)

# generate JNIFoo.h stub
set (_stubDir "${CMAKE_CURRENT_BINARY_DIR}")
add_custom_command(
OUTPUT JNIFoo.h
COMMAND ${Java_JAVAH_EXECUTABLE} -verbose
-classpath ${_classDir}
-d ${_stubDir}
-jni JNIFoo
DEPENDS JNIFoo
)

# generate libfoo.jnilib
include_directories(${JNI_INCLUDE_DIRS} ${_classDir} ${_stubDir})
add_library(foo MODULE foo.c JNIFoo.h)
set_target_properties(foo PROPERTIES SUFFIX ".jnilib")
target_link_libraries(foo ${JNI_LIBRARIES})

# add test to run JNIFoo
add_test(NAME TestJNIFoo
COMMAND ${Java_JAVA_EXECUTABLE}
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}
-cp ${_jarFile} JNIFoo)

文件 JNIFoo.java包含一个在 foo.c 中声明函数的 Java 类作为原生方法 nativeFoo . foo.c包含方法 nativeFoo 的 C 实现.

CMake 函数 add_jar将 Java 类编译为 jar 文件,并作为副作用创建一个需要作为输入传递给 javah 的类文件。 C stub 文件生成器可执行文件。使用自定义命令调用 javah生成 stub header JNIFoo.h作为输出文件。

因为 Java 使用 System.loadLibrary要在运行时加载 JNI 库,JNI 库必须生成为 MODULE使用 CMake 命令的库 add_library .添加 JNIFoo.h作为源文件确保 JNIFoo.h将在编译库之前创建。编译后的 JNI 库需要与变量 JNI_LIBRARIES 中包含的 JDK JNI 库链接。 . JNI_INCLUDE_DIRS包含要使用的 JNI 包含目录。

最后,添加了一个测试以使用 JVM 运行 JNIFoo 类。系统属性 java.library.path必须设置为包含生成的 JNI 库的目录 libfoo.jnilib .

关于java-native-interface - CMake JNI 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18994344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com