社区
Java EE
帖子详情
急急!! jnative调用dll 问题?
皮皮
2008-09-16 10:26:15
我想用JNative 组件来调用这样的
piar_compvalues(
int32 pt,
int32 PIPTR * count,
int32 times[],
float rvals [],
int32 istats[],
int32 rev );
一个方法.不知道JNative 中数组如何来使用?在大侠明白的吗?急
...全文
240
5
打赏
收藏
急急!! jnative调用dll 问题?
我想用JNative 组件来调用这样的 piar_compvalues( int32 pt, int32 PIPTR * count, int32 times[], float rvals [], int32 istats[], int32 rev ); 一个方法.不知道JNative 中数组如何来使用?在大侠明白的吗?急
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
www203
2008-09-16
打赏
举报
回复
JNI中多维数组的处理
在JNI中,如何来处理多维Java数组,还给了我一个处理String多维数组的实际程序。
那么,问题的关键在于这些多维数组在JNI中是以什么样的形式传递的呢。来看一个例子:
native static void nativePrintArray(String[] array);
native static void nativePrintArray(String[][] arrray);
这两个Java的Native函数,在javah编译出来的头文件中有什么不同呢?
我们注意到,这两个函数的Java Signature是不同的,一个是[Ljava/lang/String;)V,另外一个是[[Ljava/lang/String;)V,但是在native的.h文件中,两个Native函数的入口参数类型是完全一样的,数组对应的参数都是jobjectArray。当然,我们知道对于二维数组,这个jobjectArray中的元素本身也是jobjectArray。
在JNI的接口函数中,如下函数用以得到数组中的某个元素
jobject (JNICALL *GetObjectArrayElement) (JNIEnv *env, jobjectArray array, jsize index)
那么在多维数组的情况下,问题是,我们能否将得到的jobject转化成jobjectArray呢?参看jni.h头文件,对于C语言的情况,我们看到如下的定义:
typedef jobject jarray;
typedef jarray jobjectArray;
因此,我们知道,我们可以无缝的将我们从多维数组得到的jobject对象转换成jobjectArray。
以下是一个在native代码中打印二维String数组的元素的源代码,更高维的情况,只是增加了递归的层次而已:
Java Code:
public class TestArray {
static {
System.loadLibrary("test");
}
public static native void PrintArrays(String[][] Info);
public static void main(String[] args) {
String[][] info = {
{"INFO_00", "INFO_01", "INFO_02"},
{"INFO_10", "INFO_11"}
};
PrintArrays(info);
}
}
Native Code:
#include "TestArray.h"
JNIEXPORT void JNICALL Java_TestArray_PrintArrays
(JNIEnv *env, jclass class, jobjectArray array)
{
int size = (*env)->GetArrayLength(env, array);
for (int i = 0; i < size; i++) {
jarray myarray = ((*env)->GetObjectArrayElement(env, array, i));
int leng = (*env)->GetArrayLength(env, myarray);
printf("length: %dn", leng);
for (int j = 0; j < leng; j++) {
jstring string = ((*env)->GetObjectArrayElement(env, myarray, i));
const char * chars = (*env)->GetStringUTFChars(env, string, 0);
printf("%s n", chars);
(*env)->ReleaseStringUTFChars(env, string, chars);
}
}
}
在Solaris下,编译运行命令如下:
#javac TestArray.java
#javah TestArray
#cc -G -I/usr/java/include -I/usr/java/include/solaris -o libtest.so TestArray.c
#export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
#java TestArray
Posted at 04:55下午 六月 05, 2006 by joeys in Java SE | Comments[2]
Comments:
fosjos
2008-09-16
打赏
举报
回复
解决拉,恭喜恭喜
别忘了dispose,很容易内存泄漏
皮皮
2008-09-16
打赏
举报
回复
Pointer rva=new Pointer(MemoryBlockFactory.createMemoryBlock(16));
rva.setFloatAt(0, rvals[0]);
messageBox.setParameter(3,rva);
Pointer ist=new Pointer(MemoryBlockFactory.createMemoryBlock(4));
指针就可以了...谢谢大家了
ist.setIntAt(0, istats[0]);
皮皮
2008-09-16
打赏
举报
回复
有大侠能在给点介意吗.有关jnative 数组方面的处理
fosjos
2008-09-16
打赏
举报
回复
用jnative也可以,而且操作比较灵活
关键是要熟练掌握c语言的指针和内存的知识,因为流程类似c语言
如果楼主不熟悉的话,建议用jni
简单
jna
tive
调用
dll
例子(含
dll
代码)
一个简单的
jna
tive
调用
dll
例子,因为网上找到java的都不包含
dll
代码,所以自己研究弄了个简单例子
java利用
jna
tive
调用
DLL
.txt
java利用
jna
tive
调用
DLL
.txt
在Java程序中使用
JNa
tive
调用
dll
文件
NULL 博文链接:https://unifocus.iteye.com/blog/678463
jna
tive
框架
调用
dll
动态库-简单demo(带
dll
文件).zip
jna
tive
框架
调用
dll
动态库-简单demo(带
dll
文件)
JNA
.jar-
JNa
tive
.jar-
dll
创建-JAVA
调用
-VC
调用
包含
jna
.jar,
JNa
tive
.jar,VC++创建
DLL
例子,VC++
调用
DLL
例子,JAVA-
JNA
、
JNa
tive
调用
DLL
例子
Java EE
67,513
社区成员
225,880
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章