1. 程式人生 > >JNA型別對映例項__結構體中包含字串陣列

JNA型別對映例項__結構體中包含字串陣列

轉載請註明出處,http://blog.csdn.net/rainteen

作者郵箱:[email protected]

C程式碼中結構體定義:

typedef struct STRU_FILE_STRU
{
	char* keyStoreFile[2];
	char* keyFile[2];
}KEYSTORE_FILE_STRU;
C程式碼中使用此結構體的函式宣告:
extern "C" __declspec(dllexport) int __stdcall writeStruct(KEYSTORE_FILE_STRU* fileStruct);
C程式碼中對應宣告的函式宣告:
int _stdcall writeStruct(KEYSTORE_FILE_STRU* fileStruct)
{
	try{
		char* keystoreFile01="D:/testOK/keystoreFile01";
		int len = ::strlen(keystoreFile01);
		::memcpy(fileStruct->keyStoreFile[0], keystoreFile01, len);

		char* keystoreFile02="D:/testOK/keystoreFile02";
		len = ::strlen(keystoreFile02);
		::memcpy(fileStruct->keyStoreFile[1], keystoreFile02, len);

		char* keyFile01="D:/testOK/keyFile01";
		len = ::strlen(keyFile01);
		::memcpy(fileStruct->keyFile[0], keyFile01, len);

		char* keyFile02="D:/testOK/keyFile02";
		len=::strlen(keyFile02);
		::memcpy(fileStruct->keyFile[1], keyFile02, len);
	}catch(char *){
		return 0;
	}
	return 1;
}

JNA對映到 Java中的結構體:

package rainteen.jnadll;

import java.util.Arrays;
import java.util.List;

import rainteen.ByteArray;

import com.sun.jna.Pointer;
import com.sun.jna.Structure;

public class KEYSTORE_FILE_STRU extends Structure {
	public ByteArray.ByReference[] keyStoreFile = new ByteArray.ByReference[2];
	public ByteArray.ByReference[] keyFile = new ByteArray.ByReference[2];

	public KEYSTORE_FILE_STRU() {
		this.setAlignType(Structure.ALIGN_DEFAULT);
		this.keyStoreFile[0] = new ByteArray.ByReference();
		this.keyStoreFile[1] = new ByteArray.ByReference();
		this.keyFile[0] = new ByteArray.ByReference();
		this.keyFile[1] = new ByteArray.ByReference();
	}

	public KEYSTORE_FILE_STRU(Pointer pointer) {
		this.setAlignType(Structure.ALIGN_DEFAULT);
		this.keyStoreFile[0] = new ByteArray.ByReference();
		this.keyStoreFile[1] = new ByteArray.ByReference();
		this.keyFile[0] = new ByteArray.ByReference();
		this.keyFile[1] = new ByteArray.ByReference();
	}

	public static class ByReference extends KEYSTORE_FILE_STRU implements
			Structure.ByReference {
	}

	public static class ByValue extends KEYSTORE_FILE_STRU implements
			Structure.ByValue {
	}

	@SuppressWarnings("unchecked")
	protected List getFieldOrder() {
		return Arrays.asList(new String[] { "keyStoreFile", "keyFile" });
	}
}

其中的位元組陣列自定義結構體JNA定義如下:
package rainteen;

import java.util.Arrays;
import java.util.List;

import com.sun.jna.Pointer;
import com.sun.jna.Structure;

public class ByteArray extends Structure {
	public static final int MAX_LENGTH = 512;

	public byte[] data = new byte[MAX_LENGTH];

	public static class ByReference extends ByteArray implements
			Structure.ByReference {
	}

	public static class ByValue extends ByteArray implements Structure.ByValue {
	}

	public ByteArray() {
		super();
		this.setAlignType(Structure.ALIGN_DEFAULT);
	}

	public ByteArray(Pointer pointer) {
		super(pointer);
		this.setAlignType(Structure.ALIGN_DEFAULT);
	}

	public void init(byte[] data) {
		if (data != null) {
			int minLen = (data.length > MAX_LENGTH) ? MAX_LENGTH : data.length;
			System.arraycopy(data, 0, this.data, 0, minLen);
		}
	}

	public byte[] getData() {
		return this.data;
	}

	@SuppressWarnings("unchecked")
	protected List getFieldOrder() {
		return Arrays.asList(new String[] { "data" });
	}
}
Java中呼叫C函式的方法示例:
	@Test
	public void testWriteStruct() {
		KEYSTORE_FILE_STRU.ByReference fileStruct = new KEYSTORE_FILE_STRU.ByReference();

		int res = this.jnaDll.writeStruct(fileStruct);
		fileStruct.autoRead();
		byte[] data0 = fileStruct.keyStoreFile[0].getData();
		System.out.println(TypeUtil.toString(data0));
		byte[] data1 = fileStruct.keyStoreFile[1].getData();
		System.out.println(TypeUtil.toString(data1));

		byte[] key0 = fileStruct.keyFile[0].getData();
		System.out.println(TypeUtil.toString(key0));
		byte[] key1 = fileStruct.keyFile[1].getData();
		System.out.println(TypeUtil.toString(key1));

		Assert.assertTrue(res == 1);
	}



相關推薦

JNA型別對映例項__結構包含字串陣列

轉載請註明出處,http://blog.csdn.net/rainteen 作者郵箱:[email protected] C程式碼中結構體定義: typedef struct STRU_FILE_STRU { char* keyStoreFile[2];

C++組合(聚合)與C結構包含函式

C++組合(聚合)與C結構體中包含函式 今天突然想到C++的聚合,以前一直沒有注意,今天想到就寫下來,做個筆記; C++的類與我們的C語言中的結構體特別像,但是有有些不太一樣,這裡不多累贅了不能,大家學過的都知道。 C++組合(聚合) 我們知道的都是C++的類的物件,

結構包含二級指標案例

給出如下結構體,要求全部在堆區開闢空間。有多個老師,每個老師有多個學生。 typedef struct { char *name;//老師 int stu_num;//學生數 char **stu_arr;//學生名字 }TEACHER; 需要注意以下問題: 此問題使用雙層迴

如何給結構的字元陣列賦值。

舉例如下: char a[10]; 1、定義的時候直接用字串賦值 char a[10]="hello"; 注意:不能先定義再給它賦值,如 char a[10]; a[10]="hello"; 這樣是錯誤的! 2、對陣列中字元逐個賦值 char a[10]={'h','e',

c結構的 柔性陣列

開發C程式碼時,經常見到如下型別的結構體定義: 1 2 3 4 5 typedef struct list_t{ struct list_t *next; struct list_t *prev; char data[0]; }l

在mfc使用SendMessage傳送結構引數、字串陣列字串

在stdafx.h中新增:    #define TTMSG_WARNLIST1 5000 在A.cpp中 B.sendhwnd = this; 傳送: 1)字串陣列 在A.cpp中 CStringArray strArryWarn; CString lsv_C

C++結構包含容器,push_back異常

形如typedef struct A { vector<int> v; } AA; AA* tmp; tmp = (AA*)malloc(sizeof(AA)); tmp->v.push_back(1);//此處出錯最終發現,是因為結構體內的vect

結構存在string型別成員

#include <iostream> #include <string> #include <cstdio> using namespace std; typedef struct node{ string str; }N

unity利用反射遍歷類或者結構的每一個欄位屬性 、型別 、值

C#利用反射遍歷類或者結構體中的每一個欄位的屬性 型別 值 using System.Collections; using System.Collections.Generic; using U

TCP/IP 多種不同資料型別的傳輸--使用結構

這兩天在弄TCP/IP通訊,原本直接用位元組一個一個自己組裝並且轉換格式,麻煩不說更容易出錯。因此看到有人介紹這種方法,我試了一下發現確實很好;因此記錄下來,方便下次查閱!!! 假設需要傳送的結構體如下: typedef struct Data {

C# 8: 可變結構的只讀例項成員

在之前的文章中我們介紹了 C# 中的 [只讀結構體(readonly struct)](https://mp.weixin.qq.com/s/wwVZbdY7m7da1nmIKb2jCA)[^1] 和與其緊密相關的 [`in` 引數](https://ittranslator.cn/dotnet/csharp

在C語言結構添加成員函數

我們 pau 打印 log print class 控制 stdio.h 語言   我們在使用C語言的結構體時,經常都是只定義幾個成員變量,而學過面向對象的人應該知道,我們定義類時,不只是定義了成員變量,還定義了成員方法,而類的結構和結構體非常的相似,所以,為什麽不想想如何

c語言的特殊符號(結構

結合 特殊 value -s height 間接尋址 出現 span size  在“結構”中出現的->運算符成為“右箭頭選擇”,可以用new_node->value = 10;來代替(*new_code).value = 10;即運算符->是運算符*和運

golang 結構的匿名接口

imp -i pil win CA git Go mean others golang 結構體中的匿名接口 代碼示例 golang 中,可以給結構體增加匿名field,可參考 unknwon 大神的書。 匿名字段和內嵌結構體 但,golang同時也可以給結構體定義一個匿名i

C語言中free()函數釋放struct結構的規律

void poi inf clu main 圖片 刪除 動態分配 不同 並不是什麽新鮮的事情,不過值得註意。首先我們知道,在使用struct來定義並聲明一個變量時,將會自動劃分出一個連續的儲存空間(雖然根據某些對齊原則會出現內存間隙,但是大體上來說還是連續的)這一塊連續空間

OpencvMat結構元素的獲取與賦值

【OpenCV3影象處理】Mat中元素的獲取與賦值 ( 對比.at<>()函式 和 .ptr<>()函式) 2017年04月12日 10:08:55 閱讀數:7542 標籤: opencvopencv3 更多 個人分類:&nbs

C語言結構冒號(位域)用法

位域出現的原因是由於某些資訊的儲存表示只需要幾個bit位就可以表示而不需要一個完整的位元組,同時也是為了節省儲存空間和方便處理。   typedef struct  bit_struct {     int &n

結構運算子的過載

C++中,結構體是無法進行==,>,<,>=,<=,!=這些操作的,這也帶來了很多不方便的地方,尤其是在使用STL容器的時候,如果我們可以往語句中傳入結構體,一些事情將會變得很簡單。 比如二分查詢,binary_crearch只能對陣列進行查詢,如果是結構

結構的指標,用malloc初始化時,沒有分配足夠的記憶體空間,造成下述錯誤

      對結構體中的指標,初始化和釋放,遇到堆損壞問題(附連結點選開啟連結)點選開啟連結) out_defect.texturing = (TEXTURING *)malloc(sizeof(TEXTURING

結構使用函式指標

 struct kobj _ type  {  void (*release)(struct kobject *);  struct sysfs _ ops * sysfs _ ops;  struct attribute ** default _