我需要从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
我认为问题出在链接器上,但我不明白问题出在何处。
答案 0 :(得分:1)
在您的 CMakeLists.txt 文件中,添加
find_package(JNI REQUIRED)
target_link_libraries(games_test_system ${JNI_LIBRARIES})
除了手动选择目录外,您还可以依赖 CMake :
include_directories(${JNI_INCLUDE_DIRS}