JNA가 의존하는 여러 DLL 라이브러리를 로드하는 방법
1. 간단한 예:
/** Simple example of JNA interface mapping and usage. */
public class HelloWorld {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary)Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
void printf(String format, Object... args); // void printf(const char *format, [argument]);
}
public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World
");
for (int i=0; i < args.length; i++) {
CLibrary.INSTANCE.printf("Argument %d: %s
", i, args[i]);
}
}
}
Clibrary extends Libarary를 통해 시스템의 DLL/so 라이브러리를 불러오고 자바에서 호출할 DLL 라이브러리 함수를 열거하며 이 함수는 DLL 라이브러리 함수에 직접 JNA로 비추어 완성된다.
이렇게 하면 DLL/so 라이브러리의 함수를 호출할 수 있습니다.
2. JNA를 사용하여 여러 DLL 라이브러리를 로드하는 방법 및 종속성
http://stackoverflow.com/questions/32609829/load-multiple-libraries-with-jna
Is there a way in JNA to load multiple libraries with Java?
I usually use
Native.loadLibrary(...)
to load one DLL. But I guess its not working this way because I assign this function call to the instance member. Let's say I have library
foo
and library bar
. bar
has a dependency on foo
; it also has a dependency on baz
, which we are not mapping with JNA: public class Foo { public static final boolean LOADED; static { Native.register("foo"); LOADED = true; } public static native void call_foo(); } public class Bar { static { // Reference "Foo" so that it is loaded first if (Foo.LOADED) { System.loadLibrary("baz"); // Or System.load("/path/to/libbaz.so") Native.register("bar"); } } public static native void call_bar(); }
The call to
System.load/loadLibrary
will only be necessary if baz
is neither on your library load path ( PATH
/LD_LIBRARY_PATH
, for windows/linux respectively) nor in the same directory as bar
(windows only). EDIT
You can also do this via interface mapping:
public interface Foo extends Library { Foo INSTANCE = (Foo)Native.loadLibrary("foo"); } public interface Bar extends Library { // Reference Foo prior to instantiating Bar, just be sure // to reference the Foo class prior to creating the Bar instance Foo FOO = Foo.INSTANCE; Bar INSTANCE = (Bar)Native.loadLibrary("bar"); }
-----------------
3. 자신의 코드 예:
public class DDLTest {
public static void main(String[] args){
System.out.println(System.getProperty("java.library.path"));
FingerLibrary.Fingerdll.ZAZCloseDeviceEx(-1);
int r = ID_FprCap.fprCap.LIVESCAN_Init();
ID_FprCap.fprCap.LIVESCAN_Close();
ID_FprCap.fprCap.LIVESCAN_BeginCapture(1);
ID_FprCap.fprCap.LIVESCAN_GetFPRawData(1, "aaaaaa");
r = ID_Fpr.INSTANCE.FP_FeatureMatch("aaaaaaaaaaa", "aaaaaaaaaaa", (float)0.5);
}
public interface FingerLibrary extends Library {
int FPDATASIZE = 256;
int IMGWIDTH = 256;
int IMGHEIGHT = 288;
int IMGSIZE = 73728;
//
int WM_FPMESSAGE = 1024 + 120; //
int FPM_DEVICE = 0x01; //
int FPM_PLACE = 0x02; //
int FPM_LIFT = 0x03; //
int FPM_CAPTURE = 0x04; //
int FPM_ENROLL = 0x06; //
int FPM_GENCHAR = 0x05; //
int FPM_NEWIMAGE = 0x07; //
int RET_OK = 0x1;
int RET_FAIL = 0x0;
FingerLibrary Fingerdll = (FingerLibrary) Native.loadLibrary("ZAZAPIt", FingerLibrary.class);
public int ZAZOpenDeviceEx(int[] hHandle, int nDeviceType, int iCom, int iBaud, int nPackageSize, int iDevNum);
public int ZAZCloseDeviceEx(int handle);
public int ZAZVfyPwd(int pHandle, int nAddr, byte[] pPassword);
public int ZAZReadInfPage(int pHandle, int nAddr, byte[] pInf);
public int ZAZReadIndexTable(int pHandle, int nAddr, int nPage, byte[] UserContent);
// public int FP_FeatureMatch(String pFeatureData1, String pFeatureData2, float pfSimilarity);
}
public interface ID_Fpr extends Library {
ID_Fpr INSTANCE = (ID_Fpr)Native.loadLibrary("ID_Fpr", ID_Fpr.class);
// public int LIVESCAN_Init();
public int FP_FeatureMatch(String pFeatureData1, String pFeatureData2, float pfSimilarity);
//int __stdcall FP_FeatureMatch(unsigned char * pFeatureData1, // 1
// unsigned char * pFeatureData2, // 2
// float * pfSimilarity); // 0.00-1.00
// typedef int (__stdcall *FP_FeatureMatch)(unsigned char * pFeatureData1, // 1
// unsigned char * pFeatureData2, // 2
// float * pfSimilarity); // 0.00-1.00
}
public interface ID_FprCap extends StdCallLibrary {
ID_Fpr fpr = ID_Fpr.INSTANCE ;
ID_FprCap fprCap = (ID_FprCap)Native.loadLibrary("ID_FprCap", ID_FprCap.class);
public int LIVESCAN_Init(); //int __stdcall LIVESCAN_Init();
public int LIVESCAN_Close(); //int __stdcall LIVESCAN_Close();
public int LIVESCAN_BeginCapture(int nChannel);
public int LIVESCAN_GetFPRawData(int nChannel, String pRawData);
// int __stdcall LIVESCAN_BeginCapture( int nChannel );
// int __stdcall LIVESCAN_GetFPRawData(int nChannel,unsigned char *pRawData);
public int LIVESCAN_GetFPBmpData(int nChannel, String pBmpData);
// int __stdcall LIVESCAN_GetFPBmpData(int nChannel, unsigned char *pBmpData);
public int LIVESCAN_EndCapture(int nChannel);
// int __stdcall LIVESCAN_EndCapture(int nChannel );
public int LIVESCAN_IsSupportSetup();
// int __stdcall LIVESCAN_IsSupportSetup();
public int LIVESCAN_GetVersion();
// int __stdcall LIVESCAN_GetVersion();
public int LIVESCAN_GetDesc(String pszDesc);
// int __stdcall LIVESCAN_GetDesc(char pszDesc[1024]);
public int LIVESCAN_GetErrorInfo(int nErrorNo, String pszErrorInfo);
// int __stdcall LIVESCAN_GetErrorInfo(int nErrorNo, char pszErrorInfo[256]);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.