[CMake] making a jar from swig-generated jni library

Caron, Michael C. (US SSA) michael.caron at baesystems.com
Wed Apr 28 12:49:39 EDT 2010


I don't know if this helps but we are using a construct to do something similar.  We do something like this:

cmake_minimum_required(VERSION 2.8)
project( cplusplusapi_wrap )
MESSAGE("Please ensure the Environment variable JAVA_HOME has been set correctly")
FIND_PACKAGE(SWIG REQUIRED)
INCLUDE(${SWIG_USE_FILE})

FIND_PACKAGE(Java REQUIRED)
FIND_PACKAGE(JNI REQUIRED)
INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH})
INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH2})

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})

SET(JAVA_RUNTIME2  $ENV{JAVA_HOME}/bin/java)
SET(JAVA_ARCHIVE2  $ENV{JAVA_HOME}/bin/jar)
SET(JAVA_COMPILE2  $ENV{JAVA_HOME}/bin/javac)

SET(CMAKE_SWIG_FLAGS -package cplusplusapi)

SET(SWIG_SOURCES 
<various .i files>
/snip/
<end various .i files>
)

SET_SOURCE_FILES_PROPERTIES(${SWIG_SOURCES} PROPERTIES CPLUSPLUS ON)
#SET_SOURCE_FILES_PROPERTIES(${SWIG_SOURCES} PROPERTIES SWIG_FLAGS "-includeall")
SWIG_ADD_MODULE(cplusplusapi_wrap Java ${SWIG_SOURCES})
SWIG_LINK_LIBRARIES(cplusplusapi_wrap SAIL <required libs go here>)

ADD_CUSTOM_COMMAND(TARGET cplusplusapi_wrap
                   POST_BUILD
                   COMMAND cmake -E echo "Compiling Java files..."
                   COMMAND cmake -E make_directory ${cplusplusapi_wrap_BINARY_DIR}/cplusplusapi
                   COMMAND ${JAVA_COMPILE2} *.java -d ${cplusplusapi_wrap_BINARY_DIR}
                   COMMAND cmake -E echo "Creating jar file..."
                   COMMAND ${JAVA_ARCHIVE2} cvf cplusplusapi_wrap.jar wrappedapi
)


One of the advantages of being disorderly is that one is constantly making discoveries. 
-AA Milne
-----Original Message-----

Message: 1
Date: Tue, 27 Apr 2010 18:04:46 -0400
From: "Simmons, Aaron" <asimmons at rosettastone.com>
Subject: [CMake] making a jar from swig-generated jni library
To: "cmake at cmake.org" <cmake at cmake.org>
Message-ID:
	<9BF48DB58688484396C43886E8E7AD880695725AF7 at RSHBGXMBCLS1.rosettastone.local>
	
Content-Type: text/plain; charset="us-ascii"

I am using swig in cmake to create a JNI wrapper around a C++ library.  Everything is working fine, however I would like to jar up all the swig-generated java files.  I'm not sure how to do it.

My project looks more or less like this:
        cmake_minimum_required(VERSION 2.8)
        project(mylib)
            ...<snip>...

            # create library
            include_directories(${CMAKE_SOURCE_DIR})
            add_library(mylib mylib.cpp)
            
            # create the jni wrapper 
            SET_SOURCE_FILES_PROPERTIES(mylib.i PROPERTIES CPLUSPLUS ON)
            SWIG_ADD_MODULE(mylib-jni java mylib.i )
            target_link_libraries(mylib-jni mylib)

        project(mylib-jni Java)
            # jar up the generated swig java sources
            set(JAVA_SRCS ${CMAKE_SWIG_OUTDIR}/mylib.java ${CMAKE_SWIG_OUTDIR}/mylibJNI.java ) 
            include_directories(${CMAKE_SWIG_OUTDIR})
            add_library(mylib-java ${JAVA_SRCS})

However, this gives the error: 'Cannot find source file "mylib.java"'.  Which makes a kind of sense because mylib.java doesn't exist at cmake time.  Do the swig macros not mark the java files as "generated"?  Am I doing something wrong?


Thanks,
aaron




More information about the CMake mailing list