Swigを使用して、C ライブラリの Java バインディングを作成しています。ビルド システムは、プラットフォームの中立性を実現するためにCMakeで記述されています。Java バインディングを含む JAR ファイル (つまり、Swig によって作成された .java ファイルをコンパイルした結果の .class ファイル) を作成したいと考えています。Cmakeadd_jar()
コマンドを使用してコンパイルを実行し、JAR ファイルを生成しようとしています。
私の問題は、Swig がビルド時に一連の Java ファイルを生成するが、cmakeの実行add_jar()
時にソース ファイルのリストが必要なことです。現在、UNIX ワイルドカード (javac コマンドラインに文字どおり渡される) を使用して問題を回避しています。
# How do I avoid the shell wildcard?
add_jar(ExampleJNI ${CMAKE_SWIG_OUTDIR}/*.java)
より良い方法はありますか?
私のアプローチを示す完全な例 (3 つのファイルで構成される) を以下に示します。自分で試してみたい場合は、3 つのファイルをディレクトリに配置してから、 を呼び出しcmake . ; make VERBOSE=1
ます。
CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
find_package(Swig REQUIRED)
find_package(Java REQUIRED)
find_package(JNI REQUIRED)
include(UseJava)
include(UseSWIG)
project (Example)
add_library (Example example.c)
set(CMAKE_SWIG_FLAGS -package org.mycompany)
set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/src/main/java/org/mycompany)
swig_add_module(ExampleSWIG java example.i)
include_directories(${JNI_INCLUDE_DIRS})
swig_link_libraries(ExampleSWIG Example)
# How do I avoid the wildcard?
add_jar(ExampleJNI ${CMAKE_SWIG_OUTDIR}/*.java)
add_dependencies(ExampleJNI ExampleSWIG)
example.c
int foo() {
return 0;
}
たとえば .i
%module example
%inline %{
extern int foo();
%}
私は使っている:
- cmake バージョン 2.8.10.2
- Java バージョン「1.6.0_37」
- SWIG バージョン 2.0.9
- Mac OS X Darwin カーネル バージョン 12.2.0