有一个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;
}

解决方案 »

  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.   

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

  5.   

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

  6.   

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

  7.   

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

  8.   

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

  9.   

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