java 调用dll之jni(1)

最新用到设备,厂商提供的是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,很不错,主要是参考他做的


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值