Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Компиляция dll для подключения к Java


Автор: Гость_Александр 10.12.2005, 03:06
Господа, стоит задача подключить dll к java программе.

Посмотрел материалы, очевидно надо использовать Java JNI

Сначала компилю файлик SolveLU.java из следующего исходника
Код


public class SolveLU 
{
    public native int RLU_nn(int n, double a[], double b[], double x[]);
    static 
    {
        System.loadLibrary("solve");
    }
    
}



Затем создаю SolveLU.class с помощью javac.

После этого генерю header file SolveLU.h с помощью javah

Код

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class SolveLU */
#ifndef _Included_SolveLU
#define _Included_SolveLU
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     SolveLU
 * Method:    RLU_nn
 * Signature: (I[D[D[D)I
 */
JNIEXPORT jint JNICALL Java_SolveLU_RLU_1nn
  (JNIEnv *, jobject, jint, jdoubleArray, jdoubleArray, jdoubleArray);

#ifdef __cplusplus
}
#endif
#endif



После чего пытаюсь из этого header'a и нижестоящего кода cpp скомпилить dll.

Solve cpp

Код

#include <jni.h>
#include "SolveLU.h"
#include <math.h>
#define  Pii *(p+(i-1)*n+i-1)
#define  Pij *(p+(i-1)*n+j-1)
#define  Uki *(u+(k-1)*n+i-1)
#define  Ukj *(u+(k-1)*n+j-1)
#define  Uii *(u+(i-1)*n+i-1)
#define  Uij *(u+(i-1)*n+j-1)
int XL(int PrTr, int n, double eps, double *p, double *u);
int RXL(int n, double *u, double *b, double *x);

JNIEXPORT jint JNICALL Java_SolveLU_RLU_1nn
  (JNIEnv *env, jobject obj, jint nn, jdoubleArray a, jdoubleArray b, jdoubleArray x)
{
  int ko=0;
  int i,n;
  jdouble tau, u[100];

  double *ata = (double*)env->GetDoubleArrayElements(a, 0);
  double *atb = (double*)env->GetDoubleArrayElements(b, 0);
  double *dx = (double*)env->GetDoubleArrayElements(x, 0);
  tau=0.121e-5;
  ko = XL(1,nn,tau,ata,u);
  RXL(nn,u,atb,dx);
    
  env->ReleaseDoubleArrayElements(x, dx, 0);
  env->ReleaseDoubleArrayElements(a, atb, 0);
  env->ReleaseDoubleArrayElements(b, ata, 0);
        
  return(ko);

}
int   XL(int PrTr, int n, double eps, double *p, double *u)
{
 double Vi,Ui,s;
 int i,j,k,ko;
 ko=0;
 if (eps==0.0)  eps=0.1e-13;
 for (i=1;i<=n;i++)
 {
    s=0.0;
    if(i>1)
    {
        for (k=1;k<=i-1;k++)
          {
           s=s+Uki*Uki;
         }
    }
    Vi=Pii-s;
    if(fabs(Vi)>eps)
    {
      Uii=sqrt(Vi); Ui=1.0/Uii;
    }
    else
    {
       ko++;
       Uii=0.0; Ui=0.0;
    }
    for (j=i+1;j<=n;j++)
    {
       s=0.0;
    if(i>1)
    {
        for (k=1;k<=i-1;k++)
     {
          s=s+Uki*Ukj;
        }
      }
      Uij=(Pij-s)*Ui;
    }

  }
  if(PrTr==1)
  {
    for(i=0;i<n;i++)
     for(j=i;j<n;j++)
     {
       u[j*n+i]=u[i*n+j];
     }
  }
  return(ko);
}

int  RXL(int n, double *u, double *b, double *x)
{
  int i,j;
  double y[12],z;
  for(i=0;i<n;i++)
  y[i]=0.0;
  for(i=0;i<n;i++)
  {
    z=0.0;
     if (i>0)
     {
       for(j=0;j<i;j++)
         {
        z=z+y[j]*(*(u +i*n+j));
       }
     }
    z=*(b + i) -z;
    if(u[i*n+i]==0.0)
    {y[i]=0.0;}
      else {y[i]=z/(*(u + i*n+i));}
  }
  for(i=0;i<n;i++)
    x[i]=0.0;
   for(i=n-1;i>=0;i--)
   {
     z=0.0;
     if (i<(n-1))
     {
        for(j=n-1;j>i;j--)
        {
          z=z+x[j]*(*(u + i*n+j));
        }
     }
     z=y[i]-z;
     if((*(u +i*n+i))==0.0)
     {
       *(x +i)=0.0;
     }
     else
     {
       *(x +i)=z/(*(u + i*n+i));
     }
   }
  return(0);
}



В результате компилятор выводит ошибку

fatal error C1010: unexpected end of file while looking for precompiled header directive
smile

Заранее спасибоsmile



Автор: Metal_Heart 13.12.2005, 16:23
попробуй указать путь к jni

пример:
Код

#include <C:\java\jdk1.5.0_03\include\jni.h>


Автор: AntonSaburov 13.12.2005, 18:58
Либо при компиляции указать каталог, где лежит нужный хидер.
А можно еще статью в FAQ посмотреть - http://vingrad.ru/JAVA-JAVA-001971

Автор: Void 13.12.2005, 19:12
Цитата
В результате компилятор выводит ошибку

fatal error C1010: unexpected end of file while looking for precompiled header directive

Ошибка не имеет к JNI никакого отношения - это внутренние дела VC++.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/C1010.asp
Добавьте в начало файла #include "stdafx.h" и будет щастье.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)