2013-09-25 3 views
0

내 문제로 누군가 도와 줄 수 있기를 바랍니다. 나는 원래 Windows 용으로 만들어진 JNI 용 C 래퍼를 리눅스에서 컴파일하고있다. (나는 이미 [여기] [1]에서 풀린 질문을 가지고있다.) 내 현재 문제는 다음과 같습니다.JNI 용 C 래퍼를 연결 한 후 java.lang.UnsatisfiedLinkError

코드는 기본적으로 aaa.c, aaa.h, bbb.c으로 구성되어 있으며, 지금, 나는 코드 :: 블록에서 프로젝트를 생성

aaa.h is the header generated by "javah" tool.

aaa.c is the implementation of aaa.h bbb.h and bbb.c have some

functions called by aaa.c, one of them is:

int jstring2char(JNIEnv*, jstring, char**); 

bbb.h.

gcc -Wall -g -D_GNU_SOURCE -DUNIX -I../somepath/Inc -I/usr/local/jdk1.7.0_40/include/linux -I/usr/local/jdk1.7.0_40/include -c /somepath/Scr/aaa.c -o obj/Debug/aaa.o 
gcc -Wall -g -D_GNU_SOURCE -DUNIX -I../somepath/Inc -I/usr/local/jdk1.7.0_40/include/linux -I/usr/local/jdk1.7.0_40/include -c /somepath/Scr/bbb.c -o obj/Debug/bbb.o 
g++ -shared obj/Debug/aaa.o obj/Debug/bbb.o -o bin/Debug/libWrapper.so 

과정은 0 오류, 0 경고 완료 : 프로젝트를 빌드 할 때이 실행 된 명령입니다. 이제

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/somepath 

내가 생성 된 라이브러리를

System.loadLibrary("libWrapper.so"); 

오류로드하려고 :

Exception in thread "main" java.lang.UnsatisfiedLinkError: no libWrapper.so in java.library.path

를 생성

는 그럼 난/옵션/somepath는가에있는 라이브러리를 설치 .

[email protected]:/opt/somepath# ldd libWrapper.so 
    linux-gate.so.1 => (0x00110000) 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00161000) 
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00111000) 
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00662000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00bae000) 
    /lib/ld-linux.so.2 (0x00915000) 

그래서 내 첫 번째 문제는 "리눅스 gate.so.1는"문제를 일으키는 것입니다 만약 내가 모르겠입니다 : 나의 첫번째 추측이 일부 unsatisfaied 의존성이 내가 LDD RN 것입니다.

Native.loadLibrary("libWrapper.so", SClass.class); 

효과, 난 다른 메시지에서 가지고 :

반면에

, 나는 더 구체적인 오류 메시지가 발생했을 경우 바로 확인하려면 JNA API와 라이브러리를로드하여 테스트

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'libWrapper.so': libWrapper.so: undefined symbol: jstring2char

jstring2char은 bbb.h에서 선언 된 함수로 aaa.c에 의해 호출되는 bbb.c에서 구현됩니다. 이제는 aaa.c가 bbb.c 함수를 해결하지 못하는 것 같습니다. 두 함수 모두 빌드시에 링크되었지만.

지금 내 질문은 UnsatisfiedLinkError, linux-gate.so.1 또는 jstring2char? 함수의 원인 일 수 있습니다. 커뮤니티가 나에게 줄 수있는 힌트는 무엇입니까?

대단히 감사합니다. [1] : (예를 들어, 그것은 Windows에서 Wrapper.dll을거야)

System.loadLibrary("Wrapper"); 

파일 이름이 자동으로 계산되는 시스템에 따라 :

+0

실제 네이티브 함수 (Java 및 헤더)는 무엇입니까? –

답변

1

당신은 말할 필요가있다.

+0

당신의 힌트를 가져 주셔서 감사합니다, Kerrek. 이제 System.loadLibrary 및 Native.loadLibrary ("undefined symbol : jstring2char")와 같은 오류가 발생했습니다. 그것은 내 문제의 일부를 해결합니다. 다른 하나는 aaa.c가 둘 다 함께 링크되어있는 경우 bbb.c 함수를 호출 할 수없는 이유입니다. ( – Ferite

+0

@Ferite :'-fPIC'로 컴파일 했습니까? –

+0

-fPIC 옵션을 프로젝트에 추가했습니다. IDE가 공유 라이브러리 빌드가 아닌 파일 컴파일 명령에 옵션을 추가했습니다. 라이브러리가로드 될 때 결과는 동일합니다. – Ferite

관련 문제