본문 바로가기

심오한 세상/OSGi

Bundle-NativeCode의 비밀

Bundle-NativeCode는 OSGi를 사용할 때, MANIFEST.MF 에 등록하여 사용하는 옵션입니다.

단어 그대로 Java에 Native Code를 사용하기 위해 필요한 옵션입니다.

제가 사용한 곳은 cpu등 시스템 정보를 가져오기 위해 사용했습니다.


다른 옵션은 콤마(,)를 이용하여 구분이 됩니다.

예를 들면, Import-Package 옵션은 각 패키지마다 콤마(,)로 구분합니다.

Import-Package: org.osgi.framework

 ,org.osgi.service.framework


마찬가지로 Bundle-ClassPath 옵션도 콤마(,)로 구분합니다.

Bundle-ClassPath: .,lib/jna-3.0.9.jar,lib/sigar.jar


이렇듯 대부분의 옵션들이 콤마(,)로써 구분이 되고 있습니다.


Bundle-NativeCode 옵션은 세미콜론(;)으로 구분하고 있습니다.

Bundle-NativeCode: lib/amd64-winnt.dll

 ;lib/x86-winnt.dll

 ;lib/x86-winnt.lib

 ;lib/amd64-linux.so

 ;lib/x86-linux.so


하지만, 위의 방식이 잘못된 것은 아니지만 어딘지 불완전해 보입니다.

Bundle-NativeCode 옵션에는 osname, osversion, processor 라는 추가 옵션이 있습니다.

그렇습니다. 위 코드들은 os와 processor에 구분이 되어 있지 않습니다.

그리고 하나더 주의해야할 점은 같은 아키택처를 사용하는 native code들은 묶어서 정의해줘야합니다.


그럼 이쁘게 바꿔보겠습니다.

Bundle-NativeCode: lib/amd64-winnt.dll; osname=win32; processor=x86_64,

 lib/x86-winnt.dll; lib/x86-winnt.lib; osname=win32; processor=x86,

 lib/amd64-linux.so; osname=linux; processor=x86_64,

 lib/x86-linux.so; osname=linux; processor=x86


다른 방법도 존재합니다.

Bundle-NativeCode: /lib/x86/ntlmauth.dll;selection-filter="(&(osgi.arch=x86)(osgi.os=win32))",

 /lib/x64/ntlmauth.dll;selection-filter="(&(osgi.arch=x86_64)(osgi.os=win32))"


os aliases 들은 http://www.osgi.org/Specifications/Reference 에 있습니다. 참고하시기 바랍니다.