java调用dll如何传入指针invoke后如何获取指针的值

java调用dll如何传入指针invoke后如何获取指针的值,第1张

假设我有一个叫testdll的动态库,其中有一个函数如下:

extern "C" int add(int a,int b,int c,int d,char PicPath)

{

FILE fp;

fp=fopen(PicPath,"wt");

for(int i=0;i

{

c[i]=a[i]+b[i];

fprintf(fp,"%d\n",c[i]);

}

fclose(fp);

return 1;

}

该函数的功能是a,b两个数组的值相加,和存放的数组c中,在将和写入到指定的文件,数组的维数

有传入的参数决定。

问题提出:

1Java中如何调用指针类型的参数;

2整形的参数可以直接传入吗?;

3PicPath为何是指针型的,怎么不是CString类型的;

4如何获取输入型参数的返回值;

Java调用动态链接库的代码如下:

JNative t= new JNative("testdll", "add"); //加载testdll文件,并调用add方法;

tsetRetVal(TypeINT); // 设置调用后的返回类型

// Java中构造指针,并为指针分配空间

Pointer a = new Pointer(MemoryBlockFactorycreateMemoryBlock(4 10));

Pointer b = new Pointer(MemoryBlockFactorycreateMemoryBlock(4 10));

Pointer c = new Pointer(MemoryBlockFactorycreateMemoryBlock(4 10));

Pointer strP= createPointer(100);

strPsetStringAt(0, "C:\\1txt");

int d=10;

// 为数组a和b赋值

for (int i = 0; i

asetIntAt(4 i, i);

bsetIntAt(4 i, i);

}

// 设置参数:

tsetParameter(0, a);

tsetParameter(1, b);

tsetParameter(2, c);

tsetParameter(3, d);

tsetParameter(4, strP);

tinvoke(); // 调用函数并执行

// 输出和的值,注意:一个整形值需要用4个字节存储,所以j前面需要乘以4

for (int j = 0; j

Systemoutprintln(cgetAsInt(4 j));

}

// 释放内存

adispose();

bdispose();

cdispose();

好了,这样一个完整的调用例子就结束了,我只是写出了程序中的关键的代码,具体的还需要写一

个类,并且继承一个基类,在复写基类中的方法,这些都比较简单,大家可以参考一下网上的其他

例子。

问题解答:

1Java中调用指针类型的参数:需要创建Pointer变量,并为其分配空间

2整形的数据可以直接传入;

3JNative对CString类型支持不是很良好,调用CString的方法时,经常会报一些异常,所以我把路径改成

的字符指针;

4输入型参数作为输出:可以参见以上的例子,数组c是如何设置和输出的。

好像是DDB格式的bitmap用GetBitmap获得参数时bmBits就是NULL的

而DIB格式可以获取到bmBits值。

你可以这样获得位图数据:

CBitmap

bitmap;

bitmapLoadBitmap(IDB_BITMAP1);//位图资源ID

BITMAP

bm;

bitmapGetBitmap(&bm);

BYTE

data[48484];//数组大小根据你的大小定义

bitmapGetBitmapBits(48484,

(LPVOID)data);//获得数据,存入数组data中,数据格式,一个像素占4个字节,R

G

B

NULL

取任何变量的地址,只需要使用取地址运算符——&即可。比如

int i;

char p;   //定义一个字符指针

struct test o_o;

都可以通过&取地址运算符 *** 作。

int pi = &i;

char px = &p; //保存指针变量的地址记得使用 两个号表明是一个指向指针的指针

struct test ps = &o_o;

char和uint8是可以通用的

而数组名本身就可以做指针用

所以 直接用udp_remote_ip就好了

espconn_sent(pesp_conn, udp_remote_ip, sizeof(udp_remote_ip));

1 、定义数组,要给定其长度,也可以用Type a[ ] = {……} 的方式。

在对数组进行 *** 作时,可能需要计算数组长度,方法是:sizeof(数组名)/sizeof(元素类型)

2、指针指向的字符数组长度的获取方法,不能用sizeof,因为用sizeof(指针),得到指针长度为4

应该用strlen()函数。

#include <iostreamh>

#include <stringh>

int num(char ptr)

{

int bb = strlen(ptr);

return bb;

}

int main()

{

char p= new char[100];

p = "string";

int b = num(p);

cout<<b<<endl;

return 0;

}

delegate 委托就是函数指针

用delegate就可以了,你可以参考下MSDN中的delegate的用法,

delegate可以定义一个代理,用这个代理可以是对一个函数或方法的代理,实现上就是指针了.

比如:

public delegate void someMethod( int num, string str );

someMethod method = new someMethod( 函数名字);

这个method就是函数的指针了.

C++ ---- C#

传入的char ----string

传出的char ---- StringBuilder(预分配空间)

short ----short

char ---- byte

char[n] ---- fixed byte[n]

结构指针 ----结构指针

函数指针 ---- 委托

/////////////////////////以下是代码////////////////////

在C#中使用Delegate可以方便的包装Win32非托管dll中的函数指针(回调函数)。

如下面的Win32API:

typedef void (PFNCLIENTCONNECTED)(DWORD clientId, DWORD addr);

typedef void (PFNCLIENTDISCONNECTED)(DWORD clientId, DWORD addr);

typedef void (PFNMESSAGERECEIVED)(DWORD clientId, DWORD addr, LPCSTR message);

extern "C" __declspec(dllexport) BOOL InitializeServer(USHORT port);

extern "C" __declspec(dllexport) BOOL UninitializeServer();

extern "C" __declspec(dllexport) void RegisterClientConnectedCallback(PFNCLIENTCONNECTED clientConnected);

extern "C" __declspec(dllexport) void RegisterClientDisconnectedCallback(PFNCLIENTDISCONNECTED clientDisconnected);

extern "C" __declspec(dllexport) void RegisterMessageReceivedCallback(PFNMESSAGERECEIVED messageReceived);

可以使用类似下面的C#代码来进行调用:

class Win32Wrapper

{

public delegate void ClientConnected(uint clientID, uint address);

public delegate void ClientDisconnected(uint clientID, uint address);

public delegate void MessageReceived(uint clientID, uint address, StringBuilder message);

[DllImport("LogCenterdll")]

public static extern bool InitializeServer(ushort port);

[DllImport("LogCenterdll")]

public static extern bool UninitializeServer();

[DllImport("LogCenterdll", CallingConvention = CallingConventionCdecl)]

public static extern int RegisterClientConnectedCallback(Delegate callback);

[DllImport("LogCenterdll", CallingConvention = CallingConventionCdecl)]

public static extern int RegisterClientDisconnectedCallback(Delegate callback);

[DllImport("LogCenterdll", CallingConvention = CallingConventionCdecl)]

public static extern int RegisterMessageReceivedCallback(Delegate callback);

}

以上就是关于java调用dll如何传入指针invoke后如何获取指针的值全部的内容,包括:java调用dll如何传入指针invoke后如何获取指针的值、如何获取位图数据指针、如何取指针变量的地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9275463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存