`
skzr.org
  • 浏览: 367277 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

char *的一个bug?有不同顺序时产生

    博客分类:
  • J2EE
阅读更多

Thanks for your help :)

 

windows xp x86, jdk 1.6.20

 

hellojna dll project

hellojna.h

 

extern "C" _declspec(dllexport) int swapvalue(int* a, int* b);
extern "C" _declspec(dllexport) int rf_select1(unsigned char *_Size);
extern "C" _declspec(dllexport) int rf_select2(unsigned char *_Size,long icdev);
extern "C" _declspec(dllexport) int rf_select3(long icdev, unsigned char *_Size);

 

hellojna.cpp

 

#include "stdafx.h"
#include "hellojna.h"

int rf_select1(unsigned char *_Size) {
    _Size[0] = 'a';
    return 12;
}

int rf_select2(unsigned char *_Size, long icdev) {
    _Size[0] = 'a';
    return 12;
}

int rf_select3(long icdev, unsigned char *_Size) {
    _Size[0] = 'a';
    return 12;
}

HelloJna.java

 

public interface HelloJna extends Library {
	HelloJna instance = (HelloJna) Native.loadLibrary("hellojna", HelloJna.class);
	int rf_select1(byte[] abd);
	int rf_select2(byte[] abd, long dev);
	int rf_select3(long dev, byte[] abd);
}

Test.java 

public class Test {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		HelloJna jna = HelloJna.instance;

		byte[] buf = new byte[]{'s', 'u', 'p', 'e', 'r', ' ', 'm', 'a', 'n', '\0'};
		int ret = jna.rf_select1(buf);
		System.out.println("buf=" + new String(buf) + ",ret=" + ret);
		
		buf[0] = 'I';
		ret = jna.rf_select2(buf, 77);
		System.out.println("77 buf=" + new String(buf) + ",ret=" + ret);
		
		buf[0] = 'E';
		ret = jna.rf_select3(99, buf);
		System.out.println("99 buf=" + new String(buf) + ",ret=" + ret);
	}

}

console.out:

 

buf=auper man , ret=12
77 buf=auper man ,ret=12

the screen capter: 


why rf_select1 and rf_select2 is right but rf_select3 is error ??

the differences is just the paramters order??

in the rf_select3 _Size is null

 

buf[0] = 'E';
ret = jna.rf_select3(99, buf);

2010-09-15 00:13 add info:

 

I found it's work good when HelloJna.java change rf_select3(long dev, byte[] abd) to rf_select3(NativeLong dev, byte[] abd)

 

public interface HelloJna extends Library {
	HelloJna instance = (HelloJna) Native.loadLibrary("hellojna", HelloJna.class);
	int rf_select1(byte[] abd);
	int rf_select2(byte[] abd, long dev);
	int rf_select3(NativeLong dev, byte[] abd);
}
  • 大小: 119.3 KB
分享到:
评论
2 楼 skzr.org 2012-09-05  
duduli 写道
https://github.com/twall/jna/blob/master/www/Mappings.md
官方文档上写了:long long 类型才对应java的long类型。

莫非是这个问题,看了这个映射表,long long以前好像没有这个东西,不过当时是在32位winxp下开发测试的。
1 楼 duduli 2012-09-04  
https://github.com/twall/jna/blob/master/www/Mappings.md
官方文档上写了:long long 类型才对应java的long类型。

相关推荐

    后端面试清单,流程以及问题顺序

    后端面试清单、流程以及问题顺序 根据提供的文件信息,我们可以总结出以下知识点: 面试清单 * 自我介绍 * 离职的原因 * 问答环节场景题 PHP * 一次性插入 100w 数据的处理办法 * PHP7 的特性,为什么 PHP7 比 ...

    你必须知道的495个C语言问题

    6.1 我在一个源文件中定义了chara[6],在另一个源文件中声明了externchar*a。为什么不行? 6.2 可是我听说chara[]和char*a是等价的。是这样的吗? 6.3 那么,在C语言中“指针和数组等价”到底是什么意思? 6.4...

    《你必须知道的495个C语言问题》

    4.5 我有一个char *型指针碰巧指向一些int型变量,我想跳过它们。为什么((int *)p)++; 这样的代码不行? 47 4.6 为什么不能对void *指针进行算术操作? 47 4.7 我有些解析外部结构的代码,但是它却崩溃了,显示...

    C语言FAQ 常见问题列表

    o 7.1 我在一个源文件中定义了 char a[6], 在另一个中声明了 extern char *a 。为什么不行 ? o 7.2 可是我听说 char a[ ] 和 char *a 是一样的。 o 7.3 那么, 在 C 语言中 ``指针和数组等价" 到底是什么意思 ? ...

    linux c学习

    - **字符类型与字符编码**:C语言支持不同的字符类型,如`char`,以及不同的字符编码标准,如ASCII、UTF-8等。 ##### 3. 简单函数 - **数学函数**:如sin、cos等数学库中的函数。 - **自定义函数**:根据需求自己...

    Linux-C-编程一站式学习

    - **if/else语句**:当条件为真时执行一个代码块,否则执行另一个代码块。 - **布尔代数**:涉及逻辑运算的基本概念,如AND、OR、NOT等。 - **switch语句**:基于变量的不同值选择执行不同的代码块。 ##### 5. 深入...

    面试中的 经典的c面试

    - **增强代码的安全性**:防止意外地修改变量,减少bug的产生。 - **提高代码的可读性**:明确表明某些数据不应该被修改。 - **优化编译器性能**:编译器可以对某些const变量进行优化。 示例代码: ```c #include ...

    面试Java程序员最可能遇到的问题考试大全

    44. **一个.java文件中的类数量**:一个文件只能有一个public类,但可以有多个非public类。 45. **Java内存泄漏**:虽然有垃圾回收,但不合理使用可能导致内存无法释放。 46. **多态的机制**:通过方法的重写和向上...

    C語言學習PDF

    - **赋值**: 将一个值赋给一个变量的操作。 - **表达式**: 由常量、变量、操作符组成的组合,可以计算出一个结果。 - **字符类型与字符编码**: 字符类型如`char`用于存储单个字符;字符编码如ASCII或Unicode定义了...

    数据结构实验报告1-顺序表实现简易的学生信息管理系统(C语言)

    ### 数据结构实验报告知识点概述 本实验报告主要探讨了如何使用C语言中的顺序表来实现一个简易的学生信息...此外,本实验还提供了一个良好的平台来探索和调试代码中的潜在问题,有助于提高编程技巧和问题解决能力。

    你必须知道的495个C语言问题(PDF)

    4.3 我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行? . . . . . . . . . . . . . . 17 4.4 我有个函数,它应该接受并初始化一个指针void f(int *ip) f static ...

    删繁就简单片机从入门到精通

    - **定义**:单片机是一种集成在一个芯片上的微型计算机系统,包含了CPU(中央处理器)、RAM(随机访问存储器)、ROM(只读存储器)、定时器/计数器以及多种I/O端口等部件。 - **特点**:体积小、功耗低、价格便宜...

    JAVA常用英语单词

    - **main**:是Java程序的入口点,所有Java程序都必须有一个`main`方法。 - **class**:用于定义一个新的类。类是Java中面向对象编程的基本单位。 - **system**:提供对操作系统特定功能的访问,如系统时间、环境...

    java编程常用词汇.doc

    1. **public**:在Java中,`public` 是一个访问修饰符,它允许类、方法或变量在任何地方被访问,无论是同一个包还是不同包。 2. **static**:`static` 关键字用于创建类级别的变量和方法,它们不属于类的实例,而是...

    java常用单词

    17. **Boolean**:`Boolean`是Java中的布尔类型,有`true`和`false`两个值。 18. **true** 和 **false**:表示逻辑上的真和假。 19. **if** 和 **else**:`if`用于条件判断,`else`提供与`if`相反的执行路径。 20...

    C语言编写进制转换器

    C语言作为一种通用的编程语言,提供了丰富的功能来实现不同进制之间的转换。本项目“C语言编写进制转换器”旨在帮助开发者掌握这一技能,并能实际应用到自己的代码中。下面将详细讲解C语言中的进制转换原理以及如何...

    (完整版)Java基础英语单词表.doc

    80. **overload** - 重载:在同一个类中定义多个同名但参数列表不同的方法。 81. **Encapsulation** - 封装:面向对象编程的重要原则,保护数据和实现细节。 以上词汇涵盖了Java编程基础的各个方面,理解和掌握...

Global site tag (gtag.js) - Google Analytics