JNI的DLL调用DLL的问题

时间:2022-09-30 14:50:05
有一个DLL,WaveletB.dll,DLL中只有一个方法double* wavelet(double *,int),方法已经导出。
用VC6.0测试正常,测试源代码如下。但是在JNI中调用就报错。
#include "stdafx.h"
#include <stdio.h>
typedef double* (_cdecl* LPFNDLLWAVELET)(double*,int);

int main(int argc, char* argv[])
{
HINSTANCE hInstance; 
hInstance = LoadLibrary("WaveletB.dll");
double a[]={1,2,3,4,5,6,7,8,9};
double* b = new double[36];
if(hInstance!=NULL){
LPFNDLLWAVELET lp = (LPFNDLLWAVELET)GetProcAddress(hInstance,"wavelet");
if(lp!=NULL){
printf("Hello World!\n");
double* r=(*lp)(a,9);
for(int i=0;i<36;i++)
printf("%f\n",r[i]);
}
}
FreeLibrary(hInstance);
return 0;
}
但将这段代码改为JNI的DLL就出现问题。
jni生成的头文件如下
/*
 * Class:     org_magus_arithmetic_Wavelet
 * Method:    db5
 * Signature: ([D)[D
 */
JNIEXPORT jdoubleArray JNICALL Java_org_magus_arithmetic_Wavelet_db5
  (JNIEnv *, jobject, jdoubleArray,jint);

DLL代码如下
#include "stdafx.h"
#include "org_magus_arithmetic_Wavelet.h"
typedef double* (_cdecl* LPFNDLLWAVELET)(double*,int);
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{
    return TRUE;
}
JNIEXPORT jdoubleArray JNICALL Java_org_magus_arithmetic_Wavelet_db5
(JNIEnv * env, jobject obj, jdoubleArray in,jint len){
HINSTANCE hInstance; 
hInstance = LoadLibrary("WaveletB.dll");
int lens = len*4;
jdouble* a = env->GetDoubleArrayElements(in,JNI_FALSE);
double* pa = new double[len];
for(int i=0;i<len;i++)
pa[i]=a[i];
double* b ;
if(hInstance!=NULL){
LPFNDLLWAVELET lp = (LPFNDLLWAVELET)GetProcAddress(hInstance,"wavelet");
//(*lp)(a,9L);
if(lp!=NULL){
b =(*lp)(pa,9);
}
}
FreeLibrary(hInstance);
jdoubleArray jd = env->NewDoubleArray(lens);
env->SetDoubleArrayRegion(jd,0,lens,b);
return jd;
}

22 个解决方案

#1


错误日志
Error occurred during initialization of VM
Unable to load native library: 找不到指定的程序。
Stack Trace:
  [0] jmi.dll:_mwJavaAbort@0(0, 1024, 0x0cd8ff14, 0x0c52eeac) + 21 bytes
  [1] jvm.dll:0x0cd8fe19(0x0ce2439c "Unable to load native library", 0x0c52e978 "找不到指定的程序。", 0x0ce359cc, 0)
  [2] jvm.dll:0x0cdc8640(0, 3014656, 0, 0)
  [3] jvm.dll:0x0cd659e0(0, 0, 0x00837790, 0x00837790)
  [4] jvm.dll:0x0cd66169(0x0cdf01c9, 0x79b67568 "C:\MATLAB7/sys/java/jre/win32/jr..", 8, 0x7c3428cf)
  [5] jvm.dll:0x0cd8402f(0x0c52fcd4, 0x79b67568 "C:\MATLAB7/sys/java/jre/win32/jr..", 0x7c3428cf, 0x0c52fcfc)
  [6] jvm.dll:0x0cd9ac0b(0x79b66d30, 0x0c52fcf8, 0x0c52fcd4, 0x7c3536ed)
  [7] jmi.dll:struct JNIEnv_ * __cdecl InitSunVM(bool)(0, 0x79b5e804 "MATLAB_JDB", 0x0c52fd18, 0x50000000) + 941 bytes
  [8] jmi.dll:_InitJava(0, 0x793069ed, 0x0b72b018, 455636) + 77 bytes
  [9] jmi.dll:_mljInit(0x0b728d58, 1, 0x0b72b018, 455636) + 6 bytes
  [10] mcr.dll:unsigned long __cdecl run_init_and_handle_events(void *)(456544, 0x0b72b018, 455636, 456544) + 47 bytes
  [11] kernel32.dll:0x7c80b683(0x79306bd0, 456544, 0, 0x49474542)

#2


有没有将DLL文件放到C:\WINDOWS\system32或者是%JAVA_HOME%\bin的目录中,这样会报找不到类的错误。

#3


你这个不是调用JNI的问题吧? 好像是JVM就启不来.

#4


关注一下

#5


DLL文件都放system32下了

#6


忘了说明。这个是Matlab集成的DLL报的错误

#7


dll要放入到jdk的bin目录下

#8


我已经用VC的DEPENDS.EXE查到DLL运行所需的DLL,奇怪的是JNI的DLL以及JNI关联的DLL都在可被查找的目录里。。VC代码没问题,而JNI调用就出问题。。

#9


以前用过,好久没有用,都忘记了。

#10


mark

#11


引用 9 楼 lovingprince 的回复:
以前用过,好久没有用,都忘记了。

#12


关注一下

#13


感觉是你的dll与jvm有冲突

#14


C++项目的include路径 增加 本地jdk的include 目录和 include/win32路径了吗?
这里有个例子
http://java.chinaitlab.com/core/529394.html

#15


dll存放目录不对,放到system32或者jdk目录下,也可以放到工程根目录

#16


帮顶

#17


帮顶

#18


应该把dll文件放在工程目录下!!

#19


#20


引用 14 楼 yirentianran 的回复:
C++项目的include路径 增加 本地jdk的include 目录和 include/win32路径了吗? 
这里有个例子 
http://java.chinaitlab.com/core/529394.html

#21


经过测试,是我本机系统与Matlab冲突,非常郁闷,开发后来在虚拟机中搞定了,
现在改用Java直接调用Matlab里,经过被Matlab这么了几天,终于搞定了。
关于Java如何调用Matlab,我会做一个例子,非常感谢大家的支持。

#22


引用 21 楼 MagicianLiu 的回复:
经过测试,是我本机系统与Matlab冲突,非常郁闷,开发后来在虚拟机中搞定了,
现在改用Java直接调用Matlab里,经过被Matlab这么了几天,终于搞定了。
关于Java如何调用Matlab,我会做一个例子,非常感谢大家的支持。

支持楼主,前来学习

#1


错误日志
Error occurred during initialization of VM
Unable to load native library: 找不到指定的程序。
Stack Trace:
  [0] jmi.dll:_mwJavaAbort@0(0, 1024, 0x0cd8ff14, 0x0c52eeac) + 21 bytes
  [1] jvm.dll:0x0cd8fe19(0x0ce2439c "Unable to load native library", 0x0c52e978 "找不到指定的程序。", 0x0ce359cc, 0)
  [2] jvm.dll:0x0cdc8640(0, 3014656, 0, 0)
  [3] jvm.dll:0x0cd659e0(0, 0, 0x00837790, 0x00837790)
  [4] jvm.dll:0x0cd66169(0x0cdf01c9, 0x79b67568 "C:\MATLAB7/sys/java/jre/win32/jr..", 8, 0x7c3428cf)
  [5] jvm.dll:0x0cd8402f(0x0c52fcd4, 0x79b67568 "C:\MATLAB7/sys/java/jre/win32/jr..", 0x7c3428cf, 0x0c52fcfc)
  [6] jvm.dll:0x0cd9ac0b(0x79b66d30, 0x0c52fcf8, 0x0c52fcd4, 0x7c3536ed)
  [7] jmi.dll:struct JNIEnv_ * __cdecl InitSunVM(bool)(0, 0x79b5e804 "MATLAB_JDB", 0x0c52fd18, 0x50000000) + 941 bytes
  [8] jmi.dll:_InitJava(0, 0x793069ed, 0x0b72b018, 455636) + 77 bytes
  [9] jmi.dll:_mljInit(0x0b728d58, 1, 0x0b72b018, 455636) + 6 bytes
  [10] mcr.dll:unsigned long __cdecl run_init_and_handle_events(void *)(456544, 0x0b72b018, 455636, 456544) + 47 bytes
  [11] kernel32.dll:0x7c80b683(0x79306bd0, 456544, 0, 0x49474542)

#2


有没有将DLL文件放到C:\WINDOWS\system32或者是%JAVA_HOME%\bin的目录中,这样会报找不到类的错误。

#3


你这个不是调用JNI的问题吧? 好像是JVM就启不来.

#4


关注一下

#5


DLL文件都放system32下了

#6


忘了说明。这个是Matlab集成的DLL报的错误

#7


dll要放入到jdk的bin目录下

#8


我已经用VC的DEPENDS.EXE查到DLL运行所需的DLL,奇怪的是JNI的DLL以及JNI关联的DLL都在可被查找的目录里。。VC代码没问题,而JNI调用就出问题。。

#9


以前用过,好久没有用,都忘记了。

#10


mark

#11


引用 9 楼 lovingprince 的回复:
以前用过,好久没有用,都忘记了。

#12


关注一下

#13


感觉是你的dll与jvm有冲突

#14


C++项目的include路径 增加 本地jdk的include 目录和 include/win32路径了吗?
这里有个例子
http://java.chinaitlab.com/core/529394.html

#15


dll存放目录不对,放到system32或者jdk目录下,也可以放到工程根目录

#16


帮顶

#17


帮顶

#18


应该把dll文件放在工程目录下!!

#19


#20


引用 14 楼 yirentianran 的回复:
C++项目的include路径 增加 本地jdk的include 目录和 include/win32路径了吗? 
这里有个例子 
http://java.chinaitlab.com/core/529394.html

#21


经过测试,是我本机系统与Matlab冲突,非常郁闷,开发后来在虚拟机中搞定了,
现在改用Java直接调用Matlab里,经过被Matlab这么了几天,终于搞定了。
关于Java如何调用Matlab,我会做一个例子,非常感谢大家的支持。

#22


引用 21 楼 MagicianLiu 的回复:
经过测试,是我本机系统与Matlab冲突,非常郁闷,开发后来在虚拟机中搞定了,
现在改用Java直接调用Matlab里,经过被Matlab这么了几天,终于搞定了。
关于Java如何调用Matlab,我会做一个例子,非常感谢大家的支持。

支持楼主,前来学习