文档章节

使用 JNA 模拟C语言结构体的完整源代码

雷霄骅
 雷霄骅
发布于 2014/08/16 13:48
字数 694
阅读 110
收藏 0

C语言源代码:

头文件

#define MYLIBAPI  extern   "C"     __declspec( dllexport ) 

MYLIBAPI void say(wchar_t* pValue);

 struct UserStruct{
   long id;
   wchar_t*  name;
   int age;
};

MYLIBAPI void sayUser(UserStruct* pUserStruct);

struct CompanyStruct{
    long id;
   wchar_t*  name;
//  UserStruct*  users[100];
   UserStruct   users[100];
   int count;
};

struct CompanyStruct2{
    long id;
   wchar_t*  name;
  UserStruct*  users[100];
  // UserStruct   users[100];
   int count;
};

MYLIBAPI void sayCompany(CompanyStruct* pCompanyStruct);

MYLIBAPI void sayCompany2(CompanyStruct2* pCompanyStruct);


源文件

#include "stdafx.h"
#include <locale.h>
#include <iostream>
#include "Out.h"

void  say(wchar_t* pValue){
     std::wcout.imbue(std::locale("chs"));
     std::wcout<<L"上帝说:"<<pValue<<std::endl;
}

void sayUser(UserStruct* pUserStruct){
   std::wcout.imbue(std::locale("chs"));
   std::wcout<<L"ID:"<<pUserStruct->id<<std::endl;
   std::wcout<<L"姓名:"<<pUserStruct->name<<std::endl;
   std::wcout<<L"年龄:"<<pUserStruct->age<<std::endl;
}

void sayCompany(CompanyStruct* pCompanyStruct){
	 std::wcout.imbue(std::locale("chs"));
	 std::wcout<<L"ID:"<<pCompanyStruct->id<<std::endl;
	 std::wcout<<L"公司名称:"<<pCompanyStruct->name<<std::endl;
	 std::wcout<<L"员工总数:"<<pCompanyStruct->count<<std::endl;
     for(int i=0;i<pCompanyStruct->count;i++){
        sayUser(&pCompanyStruct->users[i]);
     }
}

void sayCompany2(CompanyStruct2* pCompanyStruct){
	std::wcout.imbue(std::locale("chs"));
	std::wcout<<L"ID:"<<pCompanyStruct->id<<std::endl;
	std::wcout<<L"公司名称:"<<pCompanyStruct->name<<std::endl;
	std::wcout<<L"员工总数:"<<pCompanyStruct->count<<std::endl;
     for(int i=0;i<pCompanyStruct->count;i++){
        sayUser(pCompanyStruct->users[i]);
     }
}


Java源文件:

请先把JNA.jar导入classpath。

package com.google.p.shendl.jna.net;
import com.google.p.shendl.jna.net.TestDll1Service.TestDll1.CompanyStruct;
import com.google.p.shendl.jna.net.TestDll1Service.TestDll1.CompanyStruct2;
import com.google.p.shendl.jna.net.TestDll1Service.TestDll1.UserStruct;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Structure;
import com.sun.jna.WString;


/**
 * @author 沈东良 Edward Shen shendl_s@hotmail.com
 * 2008-11-23 下午05:07:14
 * TestDll1.dll
 */

public class TestDll1Service {
    public interface TestDll1 extends Library {
       /**
        * 当前路径是在项目下,而不是bin输出目录下。
        */
       TestDll1 INSTANCE = (TestDll1)Native.loadLibrary("TestDll1", TestDll1.class);

       public void say(WString value);

       /*
        * 定义一个类,模拟C语言的结构
        * */

       public static class UserStruct extends Structure{

            public static class ByReference extends UserStruct implements Structure.ByReference { }
            public static class ByValue extends UserStruct implements Structure.ByValue { }

           public NativeLong id;
           public WString name;
           public int age;
       }

       public void sayUser(UserStruct.ByReference struct);

       public static class CompanyStruct extends Structure{
            public static class ByReference extends CompanyStruct implements Structure.ByReference { }
           public NativeLong id;
           public WString  name;
           //public UserStruct[] users;
           public UserStruct.ByValue[] users;
           //public UserStruct.ByValue[] users=new UserStruct.ByValue[100];
           public int count;

       }

      public   void sayCompany(CompanyStruct.ByReference pCompanyStruct);
      public static class CompanyStruct2 extends Structure{
         public static class ByReference extends CompanyStruct2 implements Structure.ByReference { }
           public NativeLong id;
           public WString  name;

           public UserStruct.ByReference[] users=new UserStruct.ByReference[100];
           public int count;

       }
      public void sayCompany2(CompanyStruct2.ByReference  pCompanyStruct);
    }
    /**
     *
     */
    public TestDll1Service() {

       // TODO Auto-generated constructor stub

    }

    /**
     * @param args
     */
    public static void main(String[] args) {
       // TODO Auto-generated method stub
       TestDll1.INSTANCE.say(new WString("Hello World!"));
       System.out.println("HHEEH我我们无法万恶");
       UserStruct.ByReference userStruct=new UserStruct.ByReference();
       userStruct.id=new NativeLong(100);
       userStruct.age=30;
       userStruct.name=new WString("沈东良");
       TestDll1.INSTANCE.sayUser(userStruct);
       System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAA");
       CompanyStruct.ByReference companyStruct=new CompanyStruct.ByReference();
       companyStruct.id=new NativeLong(1);
       companyStruct.name=new WString("Google");
       companyStruct.count=9;
        companyStruct.users=new UserStruct.ByValue[100];
       //companyStruct.users=(UserStruct[])new UserStruct().toArray(100);
       UserStruct.ByValue userStructValue=new UserStruct.ByValue();
       userStructValue.id=new NativeLong(100);
       userStructValue.age=30;
       userStructValue.name=new WString("沈东良");
       for(int i=0;i<companyStruct.count;i++){
           companyStruct.users[i]=userStructValue;
           //companyStruct.users[i].id=new NativeLong(companyStruct.users[i].id.intValue()+i);
       }

       TestDll1.INSTANCE.sayCompany(companyStruct);
       /*
       System.out.println("++++++++++++++");
       UserStruct.ByReference pUserStruct=new UserStruct.ByReference();
       pUserStruct.id=new NativeLong(90);
       pUserStruct.age=99;
       pUserStruct.name=new WString("良少");
       TestDll1.INSTANCE.sayUser(pUserStruct);
       System.out.println("---------------------");
       UserStruct.ByValue userStructValue=new UserStruct.ByValue();
       userStructValue.age=10;
       userStructValue.id=new NativeLong(1);
       userStructValue.name=new WString("良子");
       TestDll1.INSTANCE.sayUser(userStructValue);
       */
       System.out.println("BBBBBBBBBBBBBBBBBBBBBBBB");

       CompanyStruct2.ByReference companyStruct2=new CompanyStruct2.ByReference();
       companyStruct2.id=new NativeLong(2);
       companyStruct2.name=new WString("Yahoo");
       companyStruct2.count=10;
      
       UserStruct.ByReference pUserStruct=new UserStruct.ByReference();
       pUserStruct.id=new NativeLong(90);
       pUserStruct.age=99;
       pUserStruct.name=new WString("良少");
        pUserStruct.write();

    //  TestDll1.INSTANCE.sayUser(pUserStruct);

       for(int i=0;i<companyStruct2.count;i++){
           companyStruct2.users[i]=pUserStruct;
           //companyStruct.users[i].id=new NativeLong(companyStruct.users[i].id.intValue()+i);
       }

       TestDll1.INSTANCE.sayCompany2(companyStruct2);

    }

}




原文地址: http://www.cnblogs.com/armlinux/archive/2008/12/25/2390983.html


本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/12755563

雷霄骅

雷霄骅

粉丝 215
博文 419
码字总数 2129
作品 4
朝阳
程序员
私信 提问
加载中

评论(0)

JNA 基础篇 结构体

1.JNA模拟结构体 原生函数定义: java使用下面的方式模拟结构体: JNA中,定义一个类型继承Structure 类,用这个类来模拟C 语言的结构体。必须注意,Structure 子类中的公共字段的顺序,必须...

AbeJeffrey
2016/05/09
1.4K
0
JNA, Java Native开发利器

下面的文章由转载而来,java与c++的调用基本思路是这样子,但是结合我的使用经验,在使用jna和jnative的时候需要考虑到jdk的版本,jnative跟jdk1.4的结合可能会有点问题,因为我之前选的是j...

彭苏云
2013/04/16
1.6K
4
JNA 基础篇 初识JNA

1.JNA简介 JNA(Java Native Access)框架是一个开源的Java 框架,是SUN 公司主导开发的,建立在经典的JNI 的基础之上的一个框架。JNA 项目地址:https://jna.dev.java.net/。 JNI 是Java 调用...

AbeJeffrey
2016/05/09
569
0
JNA中级篇 回调函数详解

JNI 技术是双向的,既可以从Java 代码中调用原生函数,也可以从原生函数中直接创建 Java 虚拟机,并调用Java 代码。但是在原生函数中调用java代码要写大量C代码,这对大多数java程序员来说是...

AbeJeffrey
2016/05/10
1.7K
0
多智能体移动机器人--TeamBots

TeamBots是一个基于Java的多智能体移动机器人技术研究的应用程序和Java包的集合。TeamBots分发包是一个完整的源代码版本。模拟环境,是100%的Java。在移动机器人中执行时有时需要底层C语言库...

匿名
2013/05/28
1.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 如何以 Web 应用的方式启动

在 Spring Boot 启动的时候,在进程完成后会自动退出。 如何让 Spring Boot 以 Web 方式启动,并且进程不退出呢? 需要确定下 Web 的这个依赖是否在你的依赖中。 <dependency> ...

honeymoose
24分钟前
36
0
leetcode892(三维形体的表面积)--C语言实现

求: 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。 请你返回最终形体的表面积。 示例 1: 输入:[[2]] 输出:...

拓拔北海
29分钟前
48
0
使用* args和** kwargs [重复] - Use of *args and **kwargs [duplicate]

问题: This question already has answers here : 这个问题已经在这里有了答案 : What does ** (double star/asterisk) and * (star/asterisk) do for parameters? **(双星号/星号)和*(......

技术盛宴
34分钟前
42
0
spring-boot之@ConfigurationProperties的使用

@ConfigurationProperties是什么? Using the @Value("${property}") annotation to inject configuration properties can sometimes be cumbersome, especially if you are working with mu......

书中迷梦
36分钟前
67
0
让你快速掌握_正则表达式_的技巧(二)

经过上篇的快速入门了正则表达式,今天就带你快速掌握正则表达式的技巧, 话不多说,直接上干货! 正则表达式-附录【重点】 一. 规则 规则:. 含义:代表的是某一位,可以是任何字符 例如:匹配规...

煌sir
38分钟前
45
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部