env->GetByteArrayRegion(array, 0, len, buffer);
- 只需要一个JNI调用而不是两个, 减少开销.
- 不需要对原始数据进行限制或者额外的拷贝数据
- 减少开发者的风险(不会有在某些出错后忘记释放的风险)
GetArrayElementsGetArrayElements 和ReleaseArrayElements成对使用jbyte* data = env->GetByteArrayElements(array, NULL); if (data != NULL) { memcpy(buffer, data, len); env->ReleaseByteArrayElements(array, data, JNI_ABORT);}GetArrayReg
只有C++时才用
在C中的写法应该是
jbyte * arr = (*env)-> GetByteArrayElements(env,jarr, NULL);
--------------------------------------------
GetByteArrayElements的官方解释:
Returns the body of the primitive array. The result is valid until
the corresponding ReleaseArrayElements function is
called.Since the returned array may be a copy of t
翻译原文来自:http://developer.android.com/intl/zh-cn/training/articles/perf-jni.html
JNI全称是Java Native Interface, 它是一种使用java语言和原生C/C++语言相互调用,混合编程的方法. 它支持从动态链接库中加载代码, 并能使用C/C++的高效的特性
如果你之前对这个还不熟悉, 完整的读一遍
在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni层也需要把从Socket接收到的数据流返回给Java层。我简单地总结了一下,从Java层到Jni层,从Jni层到JAVA层,各有3种传递方式,下面用代码示例简单地介绍一下。
示例代码的主要文件有两个,一个是Native.java,是Java层的类;另一个是Native.c,是JNI层的文件,关键的地方我都用注释添加到代码中了,完整的代码
今天想看看android 虚拟机 GetByteArrayElements 的实现,一直没发现。分析才知,它被藏在宏里面了。
PRIMITIVE_ARRAY_FUNCTIONS(jbyte, Byte); =》展开了宏包含了一系列函数
PRIMITIVE_ARRAY_FUNCTIONS 宏定义是
#define PRIMITIVE_ARRAY_FUNCTIONS(_ctype, _jname
1 jbyte * arrayBody = env->GetByteArrayElements(data,0);
2 jsize theArrayLengthJ = env->GetArrayLength(data);
3 BYTE * starter = (BYTE *)arrayBody;
jbyteArray 转 c+...
本文翻译自 Android/sdk/docs/training/articles/perf-jni.html,大体为意译,如有不足之处,请指正。
JNI是Java本地接口。 它定义了一种用Java编写的托管代码与用C/C++编写的本地代码交互的方式。
它与供应商无关,支持从动态库中加载代码,虽然有时非常麻烦,但效率相当高。
如果你还不熟悉JNI,请先阅读Java Native...
int length =addr->getAvailableSize();//字符串长度
jbyteArray data =env->NewByteArray(length);
env->SetByteArrayRe...
-- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git
-- Java传递参数给C语言实例程序 : GitHub - https://github.com/han1202012/NDKParameterPassing.git
--C语言回调Java方法示例程
背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台。这就涉及到Android NDK(native develop kit)内容。这里只想记录下JNI(java native interface)经常遇到到问题。
问题1. 忘记delete local reference。带New到方法(如:NewByteArray)这样到方法比较好辨认
GetByteArrayElements 和 ReleaseByteArrayElements 是JNI提供的两个函数,用于获取和释放Java中的byte数组的指针,以便在C/C++代码中使用。
以下是一个示例代码,演示如何使用这两个函数:
```c++
#include <jni.h>
JNIEXPORT void JNICALL Java_MyClass_myNativeMethod(JNIEnv *env, jobject obj, jbyteArray array) {
jbyte* bytes = env->GetByteArrayElements(array, NULL);
if (bytes == NULL) {
return;
// 操作byte数组,比如将所有元素加1
int len = env->GetArrayLength(array);
for (int i = 0; i < len; i++) {
bytes[i] += 1;
env->ReleaseByteArrayElements(array, bytes, 0);
在上面的代码中,我们定义了一个名为 MyNativeMethod 的本地方法,接受一个 byte 数组作为参数。在方法中,我们首先使用 GetByteArrayElements 函数获取 byte 数组的指针,并将其存储在变量 bytes 中。然后,我们对 byte 数组进行了一些操作(在本例中,将所有元素加1)。最后,我们使用 ReleaseByteArrayElements 函数释放 byte 数组的指针。
需要注意的是,我们传递了一个额外的参数,即0,以指示 JVM 在释放 byte 数组时不需要复制回原始 Java 数组。如果传递1,则表示需要复制回原始 Java 数组。如果你希望在 C/C++ 中修改 Java 数组并将更改传递回 Java 代码,那么应该传递1。但是,这可能会降低性能,因为需要将数据从本地堆复制回 Java 堆。