「java获取指针值」JAVA的指针
今天给各位分享java获取指针值的知识,其中也会对JAVA的指针进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、JAVA中怎么处理指针参数
- 2、java通过JNI调用本地C++代码的时候,怎么获取C++中得到的指针地址
- 3、java调用dll如何传入指针?invoke后如何获取指针的值?
- 4、java中到底有没有指针
JAVA中怎么处理指针参数
用JNI技术,就是把那个函数再经过Java JNI规范包裹一下,让Java可以调用包裹的函数。
比如:
/* C++ */ void foo(void* address) { printf("%ld", address); }
要调用这样的函数
/* C++ */ jobject com_test_Klass_foo(jobject arr) { foo(convertToVoidP(arr)); }
把这个函数编译成Windows DLL或者Linux so:
在Java里:
/* Java */ package com.test; class Klass { public native foo(ArrayList? arr); static {System.loadLibrary('dll/or/so/path');}}
java通过JNI调用本地C++代码的时候,怎么获取C++中得到的指针地址
本地库代码中直接将指针转换成jlong传给java就可以了,同样,java层将该jlong类型的值传递本地库函数后做个强制类型转换就可以当成你的结点指针用了。
呵呵。
java调用dll如何传入指针?invoke后如何获取指针的值?
假设我有一个叫test.dll的动态库,其中有一个函数如下:
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中,在将和写入到指定的文件,数组的维数
有传入的参数决定。
问题提出:
1.Java中如何调用指针类型的参数;
2.整形的参数可以直接传入吗?;
3.PicPath为何是指针型的,怎么不是CString类型的;
4.如何获取输入型参数的返回值;
Java调用动态链接库的代码如下:
JNative t= new JNative("test.dll", "add"); //加载test.dll文件,并调用add方法;
t.setRetVal(Type.INT); // 设置调用后的返回类型
// Java中构造指针,并为指针分配空间
Pointer a = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
Pointer b = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
Pointer c = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
Pointer strP= createPointer(100);
strP.setStringAt(0, "C:\\1.txt");
int d=10;
// 为数组a和b赋值
for (int i = 0; i
a.setIntAt(4 * i, i);
b.setIntAt(4 * i, i);
}
// 设置参数:
t.setParameter(0, a);
t.setParameter(1, b);
t.setParameter(2, c);
t.setParameter(3, d);
t.setParameter(4, strP);
t.invoke(); // 调用函数并执行
// 输出和的值,注意:一个整形值需要用4个字节存储,所以j前面需要乘以4
for (int j = 0; j
System.out.println(c.getAsInt(4 * j));
}
// 释放内存
a.dispose();
b.dispose();
c.dispose();
好了,这样一个完整的调用例子就结束了,我只是写出了程序中的关键的代码,具体的还需要写一
个类,并且继承一个基类,在复写基类中的方法,这些都比较简单,大家可以参考一下网上的其他
例子。
问题解答:
1.Java中调用指针类型的参数:需要创建Pointer变量,并为其分配空间
2.整形的数据可以直接传入;
3.JNative对CString类型支持不是很良好,调用CString的方法时,经常会报一些异常,所以我把路径改成
的字符指针;
4.输入型参数作为输出:可以参见以上的例子,数组c是如何设置和输出的。
java中到底有没有指针
学过c/c++,然后学Java的人往往心中有此纠结,java中到底有没有指针?
如果一定要在是或否里选择一个,OK,java中没有指针。
那么,java中的引用(reference)和c/c++中的指针(如无特别说明,后文指针均指c/c++中的指针)究竟有着什么样纠葛不清的关系呢?
在开始之前先说一下c/c++的引用,它跟java的引用完全不是一个东西,c/c++的引用是同一块内存的不同名字。而java的引用是指向一个对象,引用本身也占用了内存。
首先,列举一下能对指针进行的一些常见操作:
1、指向一个对象,如 Person *p = new Person….;int *iv = new int….
2、对指针所指的对象进行操作:P-getAge(); (*p).getAge();
3、获取存储在指针中的地址值。
4、将指针指向另外一个对象:Person *p1 = new Person…; p = p1; 但,不可以*p = p1这样来赋值。
5、删除new的空间,delete p1;
6、其它诸多操作
这么多已经足够了,接下来看看java引用能做什么操作。
a、指向一个对象,如Person p = new Person…
b、调用对象的方法,p.getAge();
c、指向另外一个对象,Person p1 = new Person…; p = p1;
OK,就这么多了。
对于a和1,他们的功能是类似的,但java引用无法指向一个基本变量。。
对于b,java引用和指针就不同了,在这点上,Java reference更像是解引用(dereference)了的指针;或者说java中的.操作符某种程度上等价于指针的-操作符,如果是这样种解释的话,我们无法再对java的reference解引用了。
对c和4,是类同的。
除此,我们无法获取java引用存的地址,我们不能delete,还有很多……
综上,窃以为java的引用可以看成是一个功能受限的指针(或者说被阉割的指针)。另一方面,功能如此受限,它还能叫指针吗?了解了指针和java引用的区别与联系,还需要纠结“java中有没有指针”这个问题吗!
关于java获取指针值和JAVA的指针的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。