在多线程环境中调用native方法[原]

原创 2004年07月09日 13:36:00

这几天忙着写一个用于数据同步的Java程序,在这里遇到了一个令人头大的问题。
问题是这样:我的数据同步程序要同时跑四个线程,在其中的一个线程中,要做一个MD5的文件校验工作。这个MD5的校验是要通过调用一个dll来实现,这个dll(名字叫做MD5Operation.dll)是用于对文件内容进行MD5运算的,目的是用于做服务器端和客户端的文件校验。

类MD5Tool的源代码如下:

package com.hode.util;

public class MD5Tool
{
     public static native String hMd5( String szFilePath);  
     static
     {
           System.loadLibrary( "MD5Operation" );
     }
}

我声明了一个静态的本地方法hMD5,这样我在程序中就可以直接用MD5Tool.hMD5(filePathName)来调用了,经过我的简单测试,程序运行正常。
测试代码如下:

package com.hode.util

public class TestMD5
{
     public static void main(String[] args)
     {
          String filePathName = "C://my music//heal the world.mp3";
          String fileMD5Str = MD5Tool.hMD5(filePathName);
          System.out.println("fileMD5Str=" + fileMD5Str);
     }
}

但是当我把它拿到数据同步的程序中运行,当程序运行到MD5Tool.hMD5(filePathName)这条语句的时候,莫名其妙的终止了,而且不会抛出任何异常,这实在让人看不懂。找了半天的原因,也找不出什么问题,因为毕竟调用MD5的代码就那么几行,把它翻来覆去折腾几遍还是那个样子。我真的有点搞不定了,这时Neil拿来一本《 JAVA线程 》,他找到一页关于调用native方法的相关问题,书中说道,在多线程的环境中,调用native方法时,要声明成synchronized static的,否则会出现问题而导致线程终止。嘿嘿!有点意思了,我赶忙将代码改了过来,我的代码变成了:

package com.hode.util;

public class MD5Tool
{
     public synchronized static native String hMd5( String szFilePath);  
     static
     {
           System.loadLibrary( "MD5Operation" );
     }
}

再次运行,结果让人失望,程序仍然会终止!到底问题出在哪里??我有点灰心了... ...

既然《JAVA 线程》中已经说明了,在多线程的环境下调用native方法可能会出问题,那么是不是因为在子线程中加载dll的时候会有问题呢?不试不知道,一试吓一跳,我把dll的加载放到了主线程中,然后在子线程中进行调用,代码简略如下:

package com.hode.sync.thread;

import com.hode.util.MD5Tool;

public class MainThread extends Thread
{
     private MD5Tool myMD5Tool = new MD5Tool();   //在主线程中加载dll
    
     .... .... ....

     public static void main(String[] args)
     {
           .... .... ....

          SubThread1 T1 = new SubThread1();
          SubThread1.run();

            .... .... ....
     }
}

public class SubThread1 extends Thread
{
     public void run()
     {
           .... .... ....

          String filePathName = "C://my music//heal the world.mp3";
          String fileMD5Str = MD5Tool.hMD5(filePathName); //在子线程中调用hMD5方法
          System.out.println("fileMD5Str=" + fileMD5Str);

          .... .... ....
     }
}

运行成功啦!哦,原来是这样,在调用native方法的时候要注意以下几点:
(1) 在多线程的同时运行的时候,最好将native方法声明成synchronized static。
(2) dll的加载要在主线程中进行,但可以在子线程中调用。

[JNI] java 多线程调用native 方法

http://hi.baidu.com/zzcqh/item/25709e49ddb348afdf2a9f11 http://blog.csdn.net/fanbird2008/article/de...
  • u011627789
  • u011627789
  • 2013年09月30日 16:38
  • 903

在多线程环境中调用native方法

这几天忙着写一个用于数据同步的Java程序,在这里遇到了一个令人头大的问题。问题是这样:我的数据同步程序要同时跑四个线程,在其中的一个线程中,要做一个MD5的文件校验工作。这个MD5的校验是要通过调用...
  • TomyGuan
  • TomyGuan
  • 2006年02月21日 17:35
  • 1259

在多线程环境中调用native方法

这几天忙着写一个用于数据同步的Java程序,在这里遇到了一个令人头大的问题。问题是这样:我的数据同步程序要同时跑四个线程,在其中的一个线程中,要做一个MD5的文件校验工作。这个MD5的校验是要通过调用...
  • xiongbobo
  • xiongbobo
  • 2005年07月24日 10:19
  • 545

native方法详解

什么是Native Method       就是一个java调用非java代码的接口。该方法的实现由非java语言实现,比如C。在定义一个native method时,并不提供实现体(有些像定义一...
  • mixiuali
  • mixiuali
  • 2012年11月06日 16:10
  • 599

chap 17:当JNI遇到多线程--java对象如何被C++中的多个线程访问?

java中要访问C++代码时,使用JNI是唯一选择.然而,在多线程的情况下,可能出现以下问题: 问题描述: 一个java对象通过JNI调用DLL中一个send()函数向服务器发送消息,不等服务器消...
  • zvivi521
  • zvivi521
  • 2012年04月16日 08:47
  • 1055

JNI native多线程调用Java静态方法

前言: 最近在做音视频实时通信,因为回声问题要解决,而播放和音视频采集是异步处理,所以需要java在中间做音频流桥接;播放端的音视频播放和拉流是在子线程处理的,因此有了这个应用场景。1.因为env不能...
  • hongdameng
  • hongdameng
  • 2016年09月13日 12:25
  • 1629

ReactNative-JS调用原生方法

第一步首先创建ReactNative 模块类继承ReactContextBaseJavaModulepackage com.mixture;import android.content.Context...
  • u014360817
  • u014360817
  • 2016年09月22日 11:16
  • 1261

React Native 原生与JS之间事件绑定注册 作用在于原生可以直接调用JS的方法

1 前面我们已经说过了RN混合开发中,原生如何调用JS的各个页面 JS如何调用原生的activity,以及JS中如何调用原生的方法. 2 这些已经比较简单的,这一节主要说,我们如果在原生JAVA代码...
  • wu_xiao_yang
  • wu_xiao_yang
  • 2016年12月25日 14:50
  • 1171

Java native 本地方法调用

使用jni将失去java最大的优势,跨平台 native通俗一点就是java调用C/C++编写的动态链接库 windows是.dll linux是.so文件 本文将以linux操作系统为主...
  • qq_31105311
  • qq_31105311
  • 2016年04月27日 00:25
  • 1358

Android Studio加载so库和调用native方法

现在智能家居很火,有很多的云平台提供者,也有很多智能设备提供者,例如智能摄像头,偶然的机会我接触了一款智能摄像头PnP网络摄像头,就下载了他的sdk玩了一下,简单记录一下调用so库踩的坑。 PnP网络...
  • wxz1179503422
  • wxz1179503422
  • 2017年07月11日 15:08
  • 1481
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在多线程环境中调用native方法[原]
举报原因:
原因补充:

(最多只允许输入30个字)