最新用到设备,厂商提供的是C++接口,为此要选择java调用dll的方法先说一下jni吧
jni需要用c/c++实现一部分功能,相对比较麻烦,尤其是面对和java类型冲突时,HANDLE ,还有OUT参数都比较麻烦
记录一下jni的步骤
1.根据给出的接口名写出对应的java方法 ***.java
//升级iso区
public native int UpdateISOFileOfCDROMDriver(char[] szLetter, char[] szIsoFileName);
// int STDCALL UpdateISOFileOfCDROMDriver(IN char* szLetter, IN char* szIsoFileName);
static
{
System.loadLibrary("MediumDll");
}
2.编译成 .h 文件
javac ***.java
javah ***.
如果在eclipse中写的话注意包名
/*
* Class: CallThirdParty
* Method: UpdateISOFileOfCDROMDriver
* Signature: ([C[C)I
*/
JNIEXPORT jint JNICALL Java_CallThirdParty_UpdateISOFileOfCDROMDriver
(JNIEnv *, jobject, jcharArray, jcharArray);
#ifdef __cplusplus
}
#endif
#endif
3在vs中写实现类,这步最麻烦,要写C代码
JNIEXPORT jlong JNICALL Java_CallThirdParty_OpenDataStream (JNIEnv *env, jobject _obj, jcharArray _arg_chararray)
{
HMODULE dlh = NULL;
Handle ret = NULL;
LPFNDLLFUNC_UpdateISOFileOfCDROMDriver OpenDataStream;
if (!(dlh=LoadLibrary(L"StreamData.dll")))
{
printf("LoadLibrary() failed: %d\n", GetLastError());
}
if (!(OpenDataStream = (LPFNDLLFUNC_UpdateISOFileOfCDROMDriver)GetProcAddress(dlh, "OpenDataStream")))
{
printf("GetProcAddress() failed: %d\n", GetLastError());
}
....
4.java环境下测试
public class Test {
public static void main(String[] args) {
double doubleArray[] = {1.1, 2.5, 5,2};
CallThirdParty callThirdParty = new CallThirdParty();
int cutOffArray[] = callThirdParty.CallThirdPartyDll(doubleArray, 3, true);
for (int i = 0; i < cutOffArray.length; ++i)
System.out.println(cutOffArray[i]);
}
}
详细资料http://www.cnblogs.com/AnnieKim/archive/2012/01/01/2309567.html,很不错,主要是参考他做的