前段时间到一个公司工作。在工作期间,需要给公司解决一个java调用dll的问题,该公司以前的java掉用dll存在一个多线程的问题。
经过一天多的思考和分析。得出解决办法。以下是我对这个问题的一些想法。
1。 该dll中定义了许多全局变量,并且每回要调用dll时都要根据调用端的情况来初始化这些全局变量。所以当多线程调用时,就会出现数据混乱。因为全局变量在一个进程中是共享的。
2。第二个问题是: JNIEnv指针不能直接在多线程中共享使用。
第一个的问题的解决的方法:做一个线程池管理类:每个线程调用中的全局进行管理。
第二个问题的解决方法:JNIEnv *env指针不可为多个线程共用,但是java虚拟机的JavaVM指针是整个jvm公用的,我们可以通过JavaVM来得到当前线程的JNIEnv指针.对每一个调用的线程产生一个临时的JNIEnv指针拷贝。