`

JNative中给DLL传入数组

阅读更多

// 调用DLL,取出数组中的最大值
public voic fnGetMax(int[] arrInt) {

	try
	...
	...

	// 创建JNative对象
	JNative jnative = JNative("test.dll","fnGetMax");

	// 为数组创建空间
	Pointer aArrIntInput = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * arrInt.length));

	// 初始化数组
	for (int i = 0; i < arrInt.length; i++) {
		aArrIntInput.setIntAt(4 * i, arrInt[i]);
	}

	// 设定传入参数
	jnative.setParameter(0, pArrIntInput); // 数组指针
	jnative.setParameter(1, arrInt.length); // 数组大小

	// 设定返回类型
	jnative.setRetVal(Type.INT);

	// 调用DLL
	jnative.invoke();

	// 打印返回值
	int iRet = jnative.getRetValAsInt();
	System.out.println(iRet);

	catch
	...
	...
}


double的场合
// 传入和返回类型是double
double dParam = 10.23;
...
...
jnative.setParameter(0, Type.DOUBLE, Stirng.valueOf(dParam));
...
jnative.setRetVal(Type.DOUBLE);
...
String dRet = jnative.getRetVal();
System.out.println(dRet);
0
2
分享到:
评论
6 楼 tjmljw 2012-05-22  
kidding87 写道
好的,搞java没有,像C、C++搞过内存分配这块的东西
JNative也是瞎子摸象啊,官方的文档也没什么,就几个sample


这是JNative 1.3的文档,找不到1.4的了,凑合看下吧,一起摸索前进。
http://jnative.free.fr/docs/
5 楼 kidding87 2012-05-22  
好的,搞java没有,像C、C++搞过内存分配这块的东西
JNative也是瞎子摸象啊,官方的文档也没什么,就几个sample
4 楼 tjmljw 2012-05-22  
kidding87 写道
这句好像就是java通过调用JNative.dll来分配内存
 Pointer aArrIntInput = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * arrInt.length)); 
 


http://www.iteye.com/problems/83386#solutions
这个是我最近提的一个问题,你可以试试你的代码加上个比较大的循环,看有没有OOM


我试过了,一千万的循环下,没出现内存问题。
另外我看了你的代码,猜测几个地方可能存在问题,你可以试一试。

// 把下面代码中的100修改为实际需要内存的大小
Pointer p = new Pointer(MemoryBlockFactory.createMemoryBlock(100));


// 我没有用到这个释放内存的方法,而你的代码恰恰是这个方法中抛出了异常
// 试着注释掉这个方法试一试
JNative.freeMemory(p.getPointer()); 


// 去掉下面的方法
p.zeroMemory();


JNative我也是头一次接触,不知道能不能帮你解决问题,希望以后我们能互相帮助。
3 楼 kidding87 2012-05-19  
这句好像就是java通过调用JNative.dll来分配内存
 Pointer aArrIntInput = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * arrInt.length)); 
 


http://www.iteye.com/problems/83386#solutions
这个是我最近提的一个问题,你可以试试你的代码加上个比较大的循环,看有没有OOM
2 楼 tjmljw 2012-05-18  
kidding87 写道
不知道楼主遇到这个内存无法释放的问题没有


目前只是调查Java调用C的方法,还没有遇到内存方面的问题。
1 楼 kidding87 2012-05-18  
不知道楼主遇到这个内存无法释放的问题没有

相关推荐

    在Java程序中使用JNative调用dll文件

    3. **调用DLL函数**:使用JNative提供的API,你可以直接调用DLL中的函数。例如,如果你有一个名为`myFunction`的本地方法,可以使用`JNative.callVoidMethod`或相应的函数进行调用。 4. **错误处理**:由于涉及到...

    jnative框架调用dll动态库-简单demo(带dll文件).zip

    使用jnative时,你需要创建一个Java接口来映射DLL中的函数。接口中的方法声明应与DLL中的函数签名匹配。例如: ```java public interface MyDllLibrary { int callDllFunction(int input); } ``` 4. **加载DLL并...

    简单jnative调用dll例子(含dll代码)

    首先定义Java中的JNI接口,然后使用`javah`生成C/C++的头文件,接着编写并编译DLL,最后在Java程序中加载并调用DLL函数。这个过程虽然复杂,但是一旦熟悉了,就能灵活地在Java和本地代码之间建立桥梁,充分利用两者...

    jnative 源码及dll文件

    4. **JNI函数调用**:Java代码通过`System.loadLibrary()`加载DLL,然后通过`native`方法声明来调用DLL中的函数。 5. **本地方法接口**:JNI提供的一组接口,用于在Java和本地代码之间建立桥梁,包括创建和初始化...

    java利用jnative调用DLL.txt

    创建了一个`JNative`实例来指向DLL中的`Add`函数,并设置了返回值类型为整型。 ```java int i = 0; jnative.setParameter(i, 6); // 设置第一个参数为6 ++i; jnative.setParameter(i, 100); // 设置第二个参数为100...

    jna和jnative访问.dll的一个示例

    jna和jnative的一个简单示例工程,包含jna和jnative的jar包,还有jna的chm api文档以供参考。其中.dll是的函数是求两个数的较大值。这是我初入学习java访问.dll做的一个示例。

    JNative.jar和JNativeCpp.dll

    标题中的"JNative.jar"和"JNativeCpp.dll"是两个关键组件,分别代表Java和C++之间的交互层。在IT行业中,这样的组合通常用于实现Java应用与原生系统资源的紧密集成,例如调用操作系统底层功能或者加速计算密集型任务...

    YiKaTong.rar_JNative_YiKaTong.r_java jnative dll_jnative api_jna

    在这个例子中,`loadLibrary`加载了名为"jnative"的DLL,然后`callDllFunction`就是DLL中的一个函数,它接受一个整数和一个字符串作为参数。 总的来说,JNative提供了一个方便且高效的途径,使得Java开发者能够在不...

    JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用

    标题中的“JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用”涉及到的是Java平台下通过JNI(Java Native Interface)的两种实现方式,JNA(Java Native Access)和JNative,来与C/C++编写的动态链接库(DLL)进行交互...

    JNative相关jar包和dll ,so文件.zip

    jNative.jar jNativeCpp.dll libjNativeCpp.so 免费下载jNative.jar jNativeCpp.dll libjNativeCpp.so 免费下载jNative.jar jNativeCpp.dll libjNativeCpp.so 免费下载jNative.jar jNativeCpp.dll libjNativeCpp.so ...

    JNA.jar-JNative.jar-jinvoke.jar-dll创建-JAVA调用-VC调用

    在C/C++中调用DLL,通常涉及到`GetProcAddress`函数来获取函数指针,然后通过这个指针来调用DLL中的函数。而在Java中,JNA和JNative会处理这些细节,提供更友好的接口。 总的来说,这个压缩包提供了Java调用C/C++ ...

    java调用DLL:JNative

    下面通过一个具体的例子来展示如何使用JNative框架调用DLL中的函数。 #### 示例场景 假设我们需要编写一个Java程序,该程序调用名为`TestAppSvr.dll`的DLL文件中的`TestConnect()`函数来检测某个应用服务器的状态...

    JAVA调用动态链接库DLL之JNative学习源码

    1. **创建本地方法接口**:在Java类中声明本地方法,这些方法的实现将在DLL中完成。例如: ```java public class NativeDemo { static { System.loadLibrary("JNativeCpp"); // 加载DLL库 } public native ...

    Java调用DLL的工具 JNative

    JNative的出现,简化了这一过程,使得Java程序员可以更加便捷地利用DLL中的功能。 JNative的核心思想是通过Java接口来调用DLL中的函数,它提供了一种高级的抽象层,隐藏了JNI的底层细节。这样,开发者可以避免直接...

    JNative v1.3 docs

    jnative包用于调用dll动态库,目前(2011-12-20)最新版本为1.4RC2,官方正式版本文档为1.3,详见官方地址: http://jnative.free.fr/docs/ 这是最新的帮助文档HTML离线包,希望对大家有帮助 Packages org.xvolks....

    JNative.jar以及JNative源码

    这是一个关键的库文件,它包含Java Native Interface (JNI) 的实现,使得Java代码可以通过JNI接口调用C或C++编写的函数,这些函数通常封装在DLL中。JNative.jar使得开发者无需编写大量的JNI代码,只需简单的API调用...

    Java调用DLL例子

    - 调用DLL函数:在Java代码中调用声明的native方法,由JNative库负责实际的函数调用。 3. **具体示例**: - 假设有一个DLL文件(如kgdlltest.dll),其中包含一个名为`addNumbers`的函数,接收两个整数参数并返回...

    jnative源码和文档,包含JNativeCpp.dll和libJNativeCpp.so

    1. **设置环境**:确保Java项目包含JNative的库文件,Windows下需要设置系统路径以包含JNativeCpp.dll,Linux下则需确保libJNativeCpp.so在可执行文件的搜索路径中。 2. **编写Java代码**:在Java类中声明本地方法...

    JNative api说明文档

    在JNative中,开发者可以通过Java方法调用本地函数,就像调用Java方法一样方便。 **三、JNative API核心概念** 1. **Native Method**: 本地方法,由C/C++编写,通过JNative在Java中调用。 2. **Register Native ...

    jnative 1.3,1.4版本 外加java 调用c++ dll 案例

    在`jnative` 1.3和1.4版本中,开发者可以创建Java接口,这些接口对应于C++中的函数,然后通过`jnative`库在运行时动态地加载和调用这些函数。这个过程大大简化了Java调用C++代码的复杂性,使得Java应用程序能够充分...

Global site tag (gtag.js) - Google Analytics