jni如何访问数组?
jarray array - ...;
jsize length = (*env)->GetArrayLength(env, array);
int i, j;
jobject x = (*env)->GetObjectArrayElement(env, array, i);
(*env)->SetObjectArrayElement(env, array, j, x);
上面方法看上去很简单,但效率明显较低,你可能想要直接访问数组元素,特别是在进行向量或矩阵计算时更加明显。
我们可以使用GetXxxArrayElements函数返回一个纸箱数组起始元素的C指针。与普通的字符串一样,当你不再需要该指针时,必须记得要调用ReleaseXxx ArrayElements函数通知虚拟机。这里,类型Xxx必须是原始类型,也就是说,不能是Object。这样就可以直接读写数组元素了。另外,由于指针可能会指向一个副本,只有调用响应的ReleaseXxxArrayElemes函数时,你所做的改变才能保证在原始数组里得到反映!(通过把一个纸箱jboolean变量的指针作为第三个参数传递给该方法,就可以发现一个数组是否是副本。如果是副本,则该变量被JNI_TRUE填充。如果不感兴趣可以传NULL),例子如下:
jdoubleArray array_a =...;
double scaleFactor = ...;
double* a = (*env)->GetDoubleArrayElements(env, array_a, NULL);
for(int i = 0; i < (*env)->GetArrayLength(env, array_a); i++) {
a[i] = a[i] * scaleFactor;
}
(*env)->ReleaseDoubleArrayElements(env, array_a, a, 0);
如果要访问一个大数组的多个元素,可以使用GetXxxArrayRegion和SetXxxArrayRegion方法,它能把一定范围内的元素从Java数组赋值到C数组中或从C数组赋值到Java数组中。
可以用NewXxxArray函数在本地方法中创建新的Java数组。要穿件新的对象数组,需要制定长度、数组元素的类型和所有元素的初始值。下面是一个例子。
jclass class_Employee = (*env)->FindClass(env, "Employee");
jobjectArray array = (*env)->NewObjectArray(env, 100, class_Employee, NULL);
原始类型的数组要简单一些。只需要提供数组长度。
jdoubleArray array_d = (*env)->NewDoubleArray(env, 100);
该数组被0填充。
在JAVA SE1.4的JNI API中,增加了3个方法:
jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity);
void* GetDirectBufferAddress(JNIEnv* env, jobject buf);
jlong GetDirectBufferCapacity(JNIEnv+ env, jobject buf);
java.nio包中使用了直接缓存来支持更高效的输入输出操作,并尽可能减少本地和JAVA数组之间的赋值操作。
分享到:
相关推荐
调用iphlpapi获得本地ip信息,C++源代码演示获取ip信息的全过程。
本案例将详细讲解如何在Java中通过本地方法调用C语言实现的功能,具体以一个调用系统时间的简单例子进行说明。 首先,我们来看`TimeShow.java`这个Java类,它通常包含了一个native方法声明,例如: ```java public...
在Java程序中调用用C++语言编写的本地方法,是通过Java本地接口(JNI)实现的,JNI是Java提供的一套标准编程接口,用于Java代码和本地应用程序或库之间的交互。本地库通常是用C或C++编写的动态链接库(在Windows上是...
本文将详细讲解如何在Android中调用JavaScript的方法,以及JavaScript如何反向调用Android本地方法。 首先,让我们从Android调用JavaScript的方法开始。Android中的WebView组件是实现这种交互的主要工具。当在...
为了实现这种交互,开发者通常需要理解JS与Android本地方法之间的调用机制。本篇将深入探讨这个主题,帮助你更好地理解和实践这两种技术的融合。 一、JavaScript与Android交互基础 1. Webview:Android中的WebView...
Java本地调用接口(Java Native Interface,简称JNI)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都扮演着关键角色,比如当需要访问操作系统特定功能、优化性能或者利用已...
注,chrome 通过注册表注册表 只能调用本地的 exe 或者bat文件,不能调用 ppt word 这样的问题,所以我用VB 写了一个exe 可以接收调用参数,这样只许注册一次就可以通过传参打开所有课执行文件了 由于1.exe是后台...
在Java编程环境中,调用本地打印机是一项常见的任务,特别是在企业级应用中,如报表生成、文档打印等场景。本文将详细讲解如何利用Java API来实现这一功能,以及可能遇到的问题和解决方案。 首先,Java提供了`java....
在"JNI本地调用4"这个主题中,我们将深入探讨JNI的使用,特别是在执行本地方法和实现Java与C/C++代码集成时的关键知识点。 1. **JNI概述**:JNI是一个接口,提供了一套API,使得Java开发者可以编写本地方法来调用非...
在IT领域,Web调用本地程序是一种常见的技术需求,它允许网页通过某种方式与用户的本地计算机进行交互,执行特定的任务。这种技术广泛应用于自动化工作流程、远程服务支持、软件更新等场景。本示例提供了实现这一...
这种技术使得分布式计算成为可能,使得开发者可以构建分布式应用程序,使得客户端能够像调用本地对象一样调用远端服务器上的对象。 在RMI中,主要涉及以下几个核心概念: 1. **远程接口(Remote Interface)**:这...
标题提到的“Android-一个让http接口调用跟调用本地方法一样自然优雅的项目”正是为了解决这个问题,它旨在通过自动化的方式使得HTTP接口调用变得更为简洁、直观。 该项目的核心思想是将HTTP API与接口绑定,这样...
RMI的核心理念是让开发者能够像调用本地方法一样调用远程对象的方法,简化了分布式系统的设计和实现。 **什么是RMI** RMI(Remote Method Invocation)是一种Java技术,它提供了在不同网络节点上的Java虚拟机之间...
JS调用Android本地方法能够利用Web技术的灵活性和原生功能的强大性,为用户提供更好的体验。本篇文章将详细介绍如何在JS通过WebView调用Android的本地方法,同时规避`addJavascriptInterface`的安全问题。 首先,...
使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip...
JNI(Java Native Interface)就是为了弥补这一不足,它允许Java代码调用本地方法,这些方法通常以库文件的形式存在,如Windows上的DLL(Dynamic Link Library)或UNIX上的SO(Shared Object)文件。通过JNI,Java...
总的来说,Windows下浏览器调用本地应用程序的方法包括使用ActiveXObject(仅限IE)、创建.url快捷方式和注册自定义URL协议等。需要注意的是,这些方法都涉及对用户计算机的访问,因此在实际应用中必须谨慎处理,以...
- 性能开销:远程调用涉及序列化、网络传输等操作,性能不如本地调用。 - 复杂性:实现和维护较为复杂,尤其是处理异常情况时。 #### 六、总结 RMI为Java开发者提供了一种强大的工具,用于构建分布式应用。理解RMI...
"Java调用本地方法详细指南" Java Native Interface(JNI)是Java开发中的一种技术,允许Java代码调用本地方法,从而与其他语言编写的应用程序和库进行交互。JNI是Java Development Kit(JDK)的组成部分,已经被...