假设我有一个叫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后如何获取指针的值、如何获取位图数据指针、如何取指针变量的地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)