未定义对带有CMake的“ JNI_CreateJavaVM”的引用

时间:2018-08-23 12:50:01

标签: java c++ cmake jvm java-native-interface

我需要从C ++运行Java,通常可以解决问题,但是我的make系统或脚本出了点问题。

我有一个创建JVM的C ++文件:

#include <jni.h>
#include <iostream>
#include <string>

using namespace std;

int main() {
    JavaVMOption jvmopt[1];
    jvmopt[0].optionString = const_cast<char *>("-Djava.class.path=.");

    JavaVMInitArgs vmArgs;
    vmArgs.version = JNI_VERSION_1_2;
    vmArgs.nOptions = 1;
    vmArgs.options = jvmopt;
    vmArgs.ignoreUnrecognized = JNI_TRUE;

    // Create the JVM
    JavaVM *javaVM;
    JNIEnv *jniEnv;
    long flag = JNI_CreateJavaVM(&javaVM, (void **)
            &jniEnv, &vmArgs);

    return 0;
}

我有一个CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.12)
project(games_test_system)

include_directories(/usr/java/jdk-10.0.2/include /usr/java/jdk-10.0.2/include/linux)
link_directories(/usr/java/jdk-10.0.2/lib /usr/java/jdk-10.0.2/lib/server)

set(CMAKE_CXX_STANDARD 14)

add_executable(games_test_system main.cpp)

我通过以下方式运行它:

/opt/clion-2018.2.2/bin/cmake/linux/bin/cmake --build /home/obabichev/CLionProjects/games-test-system/cmake-build-debug --target games_test_system -- -j 4

但是我得到这个错误:

[ 50%] Linking CXX executable games_test_system
CMakeFiles/games_test_system.dir/main.cpp.o: In function `main':
/home/obabichev/CLionProjects/games-test-system/main.cpp:21: undefined reference to `JNI_CreateJavaVM'
collect2: error: ld returned 1 exit status
CMakeFiles/games_test_system.dir/build.make:83: recipe for target 'games_test_system' failed
make[3]: *** [games_test_system] Error 1
CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/games_test_system.dir/all' failed
make[2]: *** [CMakeFiles/games_test_system.dir/all] Error 2
CMakeFiles/Makefile2:84: recipe for target 'CMakeFiles/games_test_system.dir/rule' failed
make[1]: *** [CMakeFiles/games_test_system.dir/rule] Error 2
Makefile:118: recipe for target 'games_test_system' failed
make: *** [games_test_system] Error 2

我认为问题出在链接器上,但我不明白问题出在何处。

1 个答案:

答案 0 :(得分:1)

在您的 CMakeLists.txt 文件中,添加

find_package(JNI REQUIRED)
target_link_libraries(games_test_system ${JNI_LIBRARIES})

除了手动选择目录外,您还可以依赖 CMake

include_directories(${JNI_INCLUDE_DIRS}