2023-01-20 335
我写了一个绑定的C ++类,该类调用C ++调用Java.我正在尝试使用CMAKE编译绑定类(因为使用绑定类的工具使用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包含一个Java类,该类将foo.c中的函数声明为本机方法nativeFoo. foo.c包含方法nativeFoo的C实现.
cmake函数 add_jar “> add_jar 并且,作为副作用,创建一个类文件,需要将其作为输入到javah c存根文件生成器可执行文件的输入.自定义命令用于调用javah以生成存根标头JNIFoo.h作为输出文件.
因为java使用System.loadLibrary在运行时加载JNI库,因此必须将JNI库以a MODULE库生成 add_library .添加JNIFoo.h作为源文件,可确保在库库之前创建JNIFoo.h.需要将编译的JNI库与变量JNI_LIBRARIES中包含的JDK JNI库链接. JNI_INCLUDE_DIRS包含JNI包含用于使用的DIR.
最后,添加了测试以使用JVM运行JNIFOO类.系统属性java.library.path必须设置为包含生成的JNI库libfoo.jnilib的目录.
以上所述是小编给大家介绍的CMAKE JNI错误,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25947.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态