现在的位置: 首页 > 综合 > 正文

JNA两篇Blog的完整源代码

2013年10月13日 ⁄ 综合 ⁄ 共 3882字 ⁄ 字号 评论关闭

贴上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

抱歉!评论已关闭.