2012-02-23 4 views
2

私は、javaコードからヘッダファイルを生成し、非常に単純なC実行可能ファイルをコンパイルするC makefileを持っています。私が見つけることができないエラーがあります。コードを実行しようとするとUnsatisfiedLinkErrorが発生します。このMakefileをデバッグする方法

このメイクファイルの内容である:ここで

#!/usr/bin/make -f 
# 
# Makefile for native stuff 
# 

# c files to compile 
C_SOURCES := sqrt.c 

# the name of the library to build 
LIBNAME  := sqrt 

C_SOURCE_DIR := src 
C_GENSOURCE_DIR := src 

TARGET_DIR := ../../../target 
C_BUILD_DIR = $(TARGET_DIR)/native 
JAVA_BUILD_DIR = $(TARGET_DIR)/classes 

# the name of the file we build 
TARGET  = $(JAVA_BUILD_DIR)/META-INF/lib/$(LIB_PREFIX)$(LIBNAME)$(LIB_EXTN) 

# find the jdk. if this doesn't work for you, define JAVA_HOME in your 
# environment or on the make command line 
JAVA_HOME ?= /opt/jdk1.7.0_02 

# classpath for javah 
JAVAH_CLASSPATH = `cat $(TARGET_DIR)/compile-classpath` 

# tools and options 
CFLAGS = -Wall -fpic 
CPPFLAGS = -I$(C_SOURCE_DIR) -I$(C_GENSOURCE_DIR) -Iinclude \ 
    -I$(JAVA_HOME)/include 
JAVAH = /opt/jdk1.7.0_02/bin/javah 
JAVAH_FLAGS += -classpath $(JAVAH_CLASSPATH) 
JAVAH_CMD = $(JAVAH) $(JAVAH_FLAGS) $(OUTPUT_OPTION) 
LDFLAGS = -shared 
LINK.so = $(CC) $(LDFLAGS) $(LD_LIBS) 

ifdef DEBUG 
CFLAGS += -g 
LDFLAGS += -g 
endif 

# os-dependent bits 
UNAME := $(shell uname) 

ifeq ($(UNAME),Linux) 
LIB_PREFIX = lib 
LIB_EXTN = .so 
CPPFLAGS += -I$(JAVA_HOME)/include/linux 
else 
ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN) 
LIB_PREFIX = 
LIB_EXTN = .dll 
CPPFLAGS += -I$(JAVA_HOME)/include/win32 
else 
f := $(error Platform $(UNAME) not supported) 
endif 
endif 

# we look in $(C_SOURCE_DIR) for c files... 
vpath %.c $(C_SOURCE_DIR) 

# convenience variables 
C_OBJFILES = $(addprefix $(C_BUILD_DIR)/,$(subst .c,.o,$(C_SOURCES))) 

# default target 
all: $(TARGET) 

# rule to compile the .c files 
$(C_BUILD_DIR)/%.o: %.c 
    @mkdir -p `dirname [email protected]` 
    $(COMPILE.c) $(OUTPUT_OPTION) $< 

# link the C objects into a shared library 
$(TARGET): $(C_OBJFILES) $(LDLIBS) 
    @mkdir -p `dirname [email protected]` 
    $(LINK.so) $(OUTPUT_OPTION) $^ 

# a rule to build the .h file with javah      
$(C_GENSOURCE_DIR)/org_DX_57_osgi_NB_27_impl_Sqrt.h: $(JAVA_BUILD_DIR)/org/DX_57/osgi/NB_27/impl/Sqrt.class 
    rm -f [email protected]     
    $(JAVAH) $(JAVAH_FLAGS) $(OUTPUT_OPTION) org.DX_57.osgi.NB_27.impl.Sqrt 

# the .o file depends on the .h file 
$(C_BUILD_DIR)/sqrt.o: $(C_GENSOURCE_DIR)/org_DX_57_osgi_NB_27_impl_Sqrt.h 

clean:: 
    rm -f $(C_OBJFILES) 
    rm -f $(TARGET) 
    rm -f $(C_BUILD_DIR)/jnirules.mak 

は、Cファイルの内容です:

#include "org_DX_57_osgi_NB_27_impl_Sqrt.h" 

JNIEXPORT jdouble JNICALL Java_Sqrt_sqrt 
(JNIEnv *env, jclass cls, jdouble d, jdouble tol) 
{ 

    return tol; 
} 

お祈り申し上げます ピーター

+0

'../../../ target/native'に' .so'が作成されていますか? – hmjd

+0

ネイティブのフォルダにsqrt.oが見つかりました。多分これは問題ですか? –

+0

はい、 '.so'は正しくビルドされていないか、少なくともそこには存在しません。ビルドディレクトリの下に '.so'がありますか? – hmjd

答えて

2

UnsatisfiedLinkError JVMがロードに失敗した意味メークファイルが生成したネイティブ共有オブジェクト、またはネイティブ共有オブジェクトが依存する.so

../../../target/nativeからLD_LIBRARY_PATHへの絶対パスを追加すると、JVMは.soを見つけることができます。 .soが他の.soライブラリに依存する場合、.soが存在するディレクトリもLD_LIBRARY_PATHに追加する必要があります。

EDIT:

代わりの../../../target/nativeNB_27-impl/target/classes/libの絶対パスを使用します。

関連する問題