使用CMakeList创建一个c ++项目的DLL

时间:2016-05-02 19:15:19

标签: c++ dll java-native-interface

我想使用CMakeLists构建一个jni应用程序。 我将我的java文件导出为Test.h并在main.cpp文件中实现了本机方法。现在我想使用CMakeLists作为dll导出cpp项目及其所有依赖项(如jni),并将其导入我的java项目中。 当我构建应用程序(在clion中)时,构建运行没有错误并且创建了文件。但是,我似乎无法将cpp项目导出为dll:在所有创建的文件(许多.make和.cmake文件)和目录中没有dll文件。

这是我的CMakeLists文件:

cmake_minimum_required(VERSION 3.3)
project(Uebung_2_cpp)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

find_package(JNI REQUIRED)
include_directories(${JNI_INCLUDE_DIRS})

if (JNI_FOUND)
    message(STATUS "JAVA_INCLUDE_PATH2=${JAVA_INCLUDE_PATH2}")
else ()
    message(FATAL_ERROR "I really need JNI.")
endif ()

set(SOURCE_FILES
        main.cpp
        Test.h)

add_executable(Uebung_2_cpp ${SOURCE_FILES})

add_library(mylib.dll SHARED main.cpp Test.h )

我猜最后一行是垃圾,应该用更准确的说法代替。我错过了什么?

1 个答案:

答案 0 :(得分:0)

最后一行不是垃圾。在通用路径C:\ users .... Clion12 \ system \ cmake \ generated \ randomnumber \ randomnumber \ Release ...下正确设置构建/运行/调试配置时创建mylib.dll文件。

但是,由于java应用程序抛出UnsatisfiedLinkError,因此.dll在这种情况下没用。我终于能够通过简单地使用以下命令(我改编自here

)来解决问题

g++ -Wl,--add-stdcall-alias -I "<JAVA_32_BIT_HOME>\include" -I"<JAVA_32_BIT_HOME>\include\win32" -shared -o <DESIRED_.dll_FILE_PATH> <IMPLEMENTATION_FILE>

它生成一个简单的.dll文件,可以导入到java项目中并使用System.loadLibrary("<library>");进行导入 可以找到示例项目here