- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
因为我想知道是否值得使用JNI
来提高我的应用程序的性能,所以我想知道GetIntArrayElements
的复杂度是多少。它是否总是在 C
中分配一个新的原始数组并从原始 Java
数组中复制所有元素,或者它以某种方式设法传递一个指针?
我想知道是否值得将 JNI
用于线性算法,例如两个 vector 的逐点乘法。如果 GetIntArrayElements
是线性的,我想如果我们需要先复制 vector ,那么使用 C/C++
的潜在性能提升将会丢失。
最佳答案
GetIntArrayElements
有一个名为 isCopy
的可选引用参数。当 VM 复制数据供您使用时,此参数将设置为 JNI_TRUE
。这个想法是不同的 VM 实现可能有不同的数组内存表示,也可能与 C 期望的内存布局不兼容。
通常在 Java 和 native 代码之间共享内存的最快方法是使用直接 ByteBuffer
s(使用 allocateDirect
创建的)。这些缓冲区使用可直接从 C/C++ 使用的底层内存块。
在 Java 中,您创建一个缓冲区并用一些数据填充它:
public static void main(String[] args) {
byte[] ba = "Hello Wolrd!".getBytes(StandardCharsets.US_ASCII);
ByteBuffer bb = ByteBuffer.allocateDirect(ba.length + 1); // for terminator
bb.put(ba);
callCPP(bb);
}
private static native void callCPP(ByteBuffer bytes);
然后从 C/C++ 中,您可以使用 GetDirectBufferAddress
获取底层字节 block 的地址。 (这是在 C++ 中):
JNIEXPORT void JNICALL Java_Main_callCPP(JNIEnv *env, jclass, jobject buff) {
const char* str = (char*) env->GetDirectBufferAddress(buff);
printf(str); // Hello World!
}
使用 ByteBuffer
的缺点是没有数据抽象,就像类的字段有特定类型,字节缓冲区中的位置没有。
关于java - JNI : Is GetIntArrayElements always linear in time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43763129/
我应该在 GetIntArrayElements 之后调用 ReleaseIntArrayElements 吗? JNIEXPORT void JNICALL Java_com_test_Exampl
因为我想知道是否值得使用JNI 来提高我的应用程序的性能,所以我想知道GetIntArrayElements 的复杂度是多少。它是否总是在 C 中分配一个新的原始数组并从原始 Java 数组中复制所有
我想使用 GetIntArrayElements 来打印 jint 数组的内容。 我的代码如下。 JNI 代码(C): #define LOGI(...) __android_log_print(AN
我是一名优秀的程序员,十分优秀!