用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)
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
#12
关注一下
#13
感觉是你的dll与jvm有冲突
#14
C++项目的include路径 增加 本地jdk的include 目录和 include/win32路径了吗?
这里有个例子
http://java.chinaitlab.com/core/529394.html
这里有个例子
http://java.chinaitlab.com/core/529394.html
#15
dll存放目录不对,放到system32或者jdk目录下,也可以放到工程根目录
#16
帮顶
#17
帮顶
#18
应该把dll文件放在工程目录下!!
#19
顶
#20
#21
经过测试,是我本机系统与Matlab冲突,非常郁闷,开发后来在虚拟机中搞定了,
现在改用Java直接调用Matlab里,经过被Matlab这么了几天,终于搞定了。
关于Java如何调用Matlab,我会做一个例子,非常感谢大家的支持。
现在改用Java直接调用Matlab里,经过被Matlab这么了几天,终于搞定了。
关于Java如何调用Matlab,我会做一个例子,非常感谢大家的支持。
#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)
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
#12
关注一下
#13
感觉是你的dll与jvm有冲突
#14
C++项目的include路径 增加 本地jdk的include 目录和 include/win32路径了吗?
这里有个例子
http://java.chinaitlab.com/core/529394.html
这里有个例子
http://java.chinaitlab.com/core/529394.html
#15
dll存放目录不对,放到system32或者jdk目录下,也可以放到工程根目录
#16
帮顶
#17
帮顶
#18
应该把dll文件放在工程目录下!!
#19
顶
#20
#21
经过测试,是我本机系统与Matlab冲突,非常郁闷,开发后来在虚拟机中搞定了,
现在改用Java直接调用Matlab里,经过被Matlab这么了几天,终于搞定了。
关于Java如何调用Matlab,我会做一个例子,非常感谢大家的支持。
现在改用Java直接调用Matlab里,经过被Matlab这么了几天,终于搞定了。
关于Java如何调用Matlab,我会做一个例子,非常感谢大家的支持。
#22
支持楼主,前来学习