`

贴上JNA—JNI终结者、深入解析JNA—模拟C语言结构体两篇文章的完整源代码

阅读更多

原文 http://blog.csdn.net/shendl/archive/2008/12/26/3599854.aspx

贴上 JNA—JNI 终结者 深入解析 JNA— 模拟 C 语言结构体 两篇文章的完整源代码

 

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 font-size: 10pt; color: black; font-family:

分享到:
评论

相关推荐

    深入解析JNA—模拟C语言结构体

    在《JNA—JNI终结者》一文中介绍了Java Native Access (JNA) 的基本使用方法及其优势,但当时并未深入探讨如何在Java中模拟C语言中的结构体(structure)。结构体在C语言中是一种非常重要的数据类型,它允许程序员将...

    JNA 复杂结构体传递

    本文将深入探讨JNA在处理复杂结构体传递,包括结构体数组和结构体指针方面的知识。 JNA是一种Java库,允许Java代码直接调用本机API,而无需编写JNI代码。相比于JNI,JNA的使用更为简单和直观,但可能在性能上稍逊...

    JNA 转java接口以及指针结构体解析

    在"JNA 转java接口以及指针结构体解析"这个主题中,我们将深入探讨如何使用JNA来处理C语言中的结构体和指针。 首先,理解JNA的基本工作原理至关重要。JNA通过定义一个`Interface`,该接口中的方法对应于要调用的...

    java通过jna返回结构体例子.rar

    JNA是一种纯Java库,允许Java代码直接调用本地库(如C库)的功能,而无需编写JNI(Java Native Interface)代码。它通过映射C函数和结构到Java类型来实现这一目标。 在C语言中,结构体是数据组织的一种方式,可以...

    jni C结构体转JAVA实体类

    可实现将C语言中的结构体转换为JAVA类型的实体类。 目前支持基础数据类型int、long、foloat、double、const char *、bool的转换,也支持将数组装换为JAVA中的ArrayList。目前有个难点是将枚举类型直接转换为JAVA中的...

    jni-jna-web.zip

    JNI(Java Native Interface)和JNA(Java Native Access)是Java平台中用于与本地代码交互的两种主要技术。它们允许Java应用程序调用C、C++等本地库,从而扩展Java的功能,解决性能瓶颈或利用已有的非Java库。本...

    JNI与JNA性能的比较.docx

    JNI(Java Native Interface)和JNA(Java Native Access)都是Java平台上的原生接口技术,允许Java代码与操作系统底层交互,调用本地库。它们在功能上类似,但实现方式不同,因此性能也有所差异。 ### JNI JNI是...

    jna-master测试代码源代码.zip

    JNA(Java Native Access)是Java平台上的一个开源库,它允许Java代码直接调用操作系统原生函数,而无需编写JNI(Java Native Interface)代码。这个"jna-master测试代码源代码.zip"文件包含了基于JNA 5.6.0版本的...

    JNA实例 JNA实例 JNA实例

    C语言源代码主要定义了几个函数和结构体,包括: - `say`: 该函数用于输出传入的字符串。 - `sayUser`: 该函数用于输出`UserStruct`结构体中的信息。 - `sayCompany` 和 `sayCompany2`: 这两个函数分别用于输出`...

    深入浅出JNA—快速调用原生函数

    值得注意的是,虽然JNA提供了便利,但它在性能上可能比直接使用JNI调用动态链接库慢一些,因为JNA封装了调用原生代码的过程。然而,对于绝大多数项目而言,这种性能损失的影响不大,因为JNA大大提高了开发效率和易用...

    JNA 4.1.0 官方版

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C语言的JNI(Java Native Interface)代码。JNA 4.1.0是该库的一个官方版本,提供了增强的功能和...

    com.sun.jna 3.0.9

    "jna" 指的是Java Native Access,而 "jna-example" 暗示了这个话题将涉及JNA的使用示例,这对于初学者或者需要深入理解JNA功能的人来说非常有价值。 **文件列表解析:** 压缩包中唯一的文件 `jna-3.0.9.jar` 应该...

    jna整合包-jna4.5.0+jna4.0.0.rar

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写任何C/C++代码或使用JNI(Java Native Interface)。JNA通过提供一种映射机制,将Java方法与本地库...

    利用jna在java下调用c语言库文件

    Java JNA(Java Native Access)是一种在Java平台上与本地代码交互的库,允许开发者无需编写JNI(Java Native Interface)代码就能调用C、C++等本地库。本示例将详细解析如何使用JNA在Java中调用C语言库文件。 首先...

    JNA调用DLL完整实例demo

    本篇文章将深入探讨如何使用JNA来调用DLL,并提供一个完整的实例。 首先,了解JNA的基本原理至关重要。JNA通过映射Java接口到原生函数来实现与本地代码的交互。这些接口定义了要调用的函数签名,JNA会自动处理参数...

    jna java代码生成工具

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C语言的头文件或动态链接库。JNA通过一个映射机制,将Java方法与C/C++函数相对应,从而实现跨语言的...

    深入浅出JNA

    ### 深入浅出JNA — 快速调用原生函数 #### 为什么需要JNA? 在软件开发过程中,特别是在需要与操作系统底层交互或利用高性能计算资源时,经常需要用到原生函数(通常指C/C++语言编写的库)。Java作为一种高级语言...

    jna-3.3.0 & jna-3.3.0-platform

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C/C++的桥接代码。JNA通过映射Java方法到本地函数,实现了Java与操作系统底层功能的交互,极大地...

    jna运行在android上的例子

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生(native)函数,而无需编写JNI(Java Native Interface)代码。JNA通过映射C数据类型和函数调用来实现这一目标,极...

Global site tag (gtag.js) - Google Analytics