楼主可否能把代码填全一些
是在地层实现中把结构体中内容都得到后,返回给调用者(Java对象),通常这些是java 对象的成员变量
是在地层实现中把结构体中内容都得到后,返回给调用者(Java对象),通常这些是java 对象的成员变量
解决方案 »
- activity之间跳转出现错误。
- 发送一条腾讯微博
- android 通过一个程序启动另外一个程序出现的问题
- 在全屏幕上实现点击处产生控件的效果
- Android上能用.net开发应用么?如果能,需要哪些条件及技术?
- 如何让一个Activity区别于其它的,以便让Intent能直接启动
- 关于SQLite数据库的R*Tree
- Android蓝牙传输文件为什么不需要配对呢
- AlertDialog.setSingleChoiceItems 单选dialog框在阿拉伯语下图标还是在最右边如何解决
- android SDK 有32位或64位的分别吗?
- 散分,光棍节快乐
- android sqlit中文乱码问题
那个C函数本来就是人家封装好在DLL中的,现在Struct结构体,函数调用接口都有了,还差什么吗???????????
我是没有实现JNative类的,我是用
Pointer pstruct = new Pointer(new HeapMemoryBlock(16));
jnative.setParameter(4, pstruct);
来定义指针类的,因为C语言的test_Login是返回值的结构体,不需要setparamet传参数。JNative类我也试过,C的BYTE类型我对应Java的long类型,比如:
C:BYTE byAlarmInPortNum; //输入个数
Java:long byAlarmInPortNum; //输入个数但是用jnative.getNextLong()获取返回值跟实际值完全不一样!!!
typedef struct {
BYTE sSerialNumber[SERIALNO_LEN]; //序列号
的那个序列号我用JNative的指针pstruct.getAsString()获取结构体的返回值是正确的
但是结构体除序列号外的其他参数都获取不正确,getNextInt()、getNextLong()、getNextByte()、getNextShort()我都试过了,获取返回来的值都是不对的!!!!!
取不了值应该不可能,那为什么结构体的第一个“序列号”参数值可以取得正确,应该是数据类型不能匹配的问题!
首先确定这个分配的空间足够吗?考虑到结构体的数据对齐,而且不同编译器还不一样
现在我分配给它的空间是:
Pointer pstruct = new Pointer(new HeapMemoryBlock(48*7));
这个48*7=336应该够了吧,我想应该不是空间的问题,如果是空间的问题,为什么第一个参数“序列号”返回值是正确的,这个“序列号”就是一串长度为48的字符串!现在取上来的“序列号”是完全正确的.
p2.setIntAt(0, 100);
看到有人这么用是不是有相反的取法?
BYTE byAlarmInPortNum; //输入个数 pstruct.getAsInt(1)?
BYTE byAlarmOutPortNum; //输出个数 ..
BYTE byDiskNum; // ..
BYTE byDVRType; //类型,
BYTE byChanNum; //
BYTE byStartChan; //
估计是数据类型不匹配,但是C语言的BYTE类型对应JAVA的什么类型呢?还有就是Pointer只有这败类型:getNextInt()、getNextLong()、getNextByte()、getNextShort()啊!
to SkyGray:
Pointer的getAsString方法好像没有参数吧,我这里只能是空参数,不能pstruct.getAsString(0)这样用!
得到的结果跟以下:
Pointer p2 = new Pointer(new HeapMemoryBlock(48*7));
p2.setIntAt(0, p2.getSize());得到的结果一样,不是不对,不知道怎么取那个数据类型了!!!
C里面的那个BYTE值是16
JNative通过this.getPointer().getAsByte(0)取出的值是68
用getAsInt(0)取也是一样是68!!!!!
getAs其实就有一个数据转换的过程了,所以不论你AsByte或者AsInt,只要里面的数据位可以满足转换,得到的结果可能会一样,我猜的啊呵呵
jint jsetValue(JNIEnv* env, jobject clazz, jint i)
{
setValue(i);
}
java端还要自己建个类
class jNative{
static {
System.loadLibrary("jNative_runtime");
}
public static native int setValue(int i);
}
我这是标准的C语言写的DLL,而且我也不是用Android来调用DLL!!!
楼主自己测试一下吧