萍聚社区-德国热线-德国实用信息网

 找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

查看: 2185|回复: 0

求精通C语言高手解决问题

[复制链接]
发表于 2010-1-7 14:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册 微信登录

x
本帖最后由 schmuttering 于 2010-1-9 12:28 编辑

我要用Java调用dll的数据库,发现interface里面的结构很复杂,C语言头文件里面的Struct太多指针了,好像是用到了指针的指针的指针这种复杂方式。我在Java里面完全不知道怎么转换到正确的内存块上去
GM_Lib.h的内容是这样的:
#include "extcode.h"
#pragma pack(push)
#pragma pack(1)
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
        int32_t dimSize;
        double M[1];
        } TD3;
typedef TD3 **TD3Hdl;
typedef struct {
        int32_t dimSize;
        double n[1];
        } TD4;
typedef TD4 **TD4Hdl;
typedef struct {
        TD3Hdl elt1;
        TD4Hdl elt2;
        } TD2;
typedef struct {
        int32_t dimSize;
        TD2 elt[1];
        } TD1;
typedef TD1 **TD1Hdl;
void __stdcall Interface_GM_01(double Luftspaltlaenge, double Motorlaenge,
        double Polueberdeckung, double Ankerwindungszahl, double Erregerjoch,
        double Nutbreite, double Erregerpolbreite, TD1Hdl *Kennlinie);
long __cdecl LVDLLStatus(char *errStr, int errStrLen, void *module);
#ifdef __cplusplus
} // extern "C"
#endif
#pragma pack(pop)

下面是JAVA调用dll的程序
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Structure;

public class TD1Hdl extends Structure{
public int dimSize;
public TD2Hdl elt[] = new TD2Hdl[1];
}
public class TD2Hdl extends Structure{
public TD3Hdl elt1;
public TD4Hdl elt2;
}
public class TD3Hdl extends Structure{
public int dimSize;
public double M[] = new double[1];
}
public class TD4Hdl extends Structure{
public int dimSize;
public double n[] = new double[1];
}

public class ReadGmLib {
static TD1Hdl Kennlinie = new TD1Hdl();

public interface GM_Lib extends Library {
  GM_Lib INSTANCE = (GM_Lib) Native.loadLibrary("GM_Lib", GM_Lib.class);

  public void Interface_GM_01(double Luftspaltlaenge, double Motorlaenge,
    double Polueberdeckung, double Ankerwindungszahl,
    double Erregerjoch, double Nutbreite, double Erregerpolbreite,
    TD1Hdl Kennlinie);  
}

public static void main(String[] args) {
  double Luftspaltlaenge = 0;
  double Motorlaenge = 0;
  double Polueberdeckung = 0;
  double Ankerwindungszahl = 0;
  double Erregerjoch = 0;
  double Nutbreite = 0;
  double Erregerpolbreite = 0;
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  System.out.println("Please input 7 parameters:");
  try {
   Luftspaltlaenge = Double.parseDouble(br.readLine());
   Motorlaenge = Double.parseDouble(br.readLine());
   Polueberdeckung = Double.parseDouble(br.readLine());
   Ankerwindungszahl = Double.parseDouble(br.readLine());
   Erregerjoch = Double.parseDouble(br.readLine());
   Nutbreite = Double.parseDouble(br.readLine());
   Erregerpolbreite = Double.parseDouble(br.readLine());
  } catch (IOException e) {
   System.out.println("error!");
  }
  GM_Lib.INSTANCE.Interface_GM_01(Luftspaltlaenge, Motorlaenge,
    Polueberdeckung, Ankerwindungszahl, Erregerjoch, Nutbreite,
    Erregerpolbreite, Kennlinie);         
  double m = Kennlinie.elt[0].elt1.M[0];
  double n = Kennlinie.elt[0].elt2.n[0];
  System.out.printf("M=",m);
  System.out.printf("\n");
  System.out.printf("n=",n);
}
}
现在我的输出结果是空的,就是说数据库的进不去,请求高手帮我编一下这个程序,应该怎么转进去,然后读出来.另外,希望有具体的代码,我是初学者,很不会编程,谢谢,麻烦大家了
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

手机版|Archiver|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网 |网站地图

GMT+2, 2024-4-28 15:18 , Processed in 0.054797 second(s), 20 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表