有一个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;
}
用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;
}
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)
这里有个例子
http://java.chinaitlab.com/core/529394.html
现在改用Java直接调用Matlab里,经过被Matlab这么了几天,终于搞定了。
关于Java如何调用Matlab,我会做一个例子,非常感谢大家的支持。