首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake JNI错误

CMake JNI错误
EN

Stack Overflow用户
提问于 2013-09-25 08:35:30
回答 1查看 9.3K关注 0票数 6

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

但是,我收到以下错误:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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脚本。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-27 01:13:01

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

代码语言:javascript
复制
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中的函数声明为本机方法nativeFoofoo.c包含nativeFoo方法的C实现。

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

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

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

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18994344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档