NDK / JavaでJNIとC / C ++アレイがすれ違います

NDK / JavaでJNIとC / C ++アレイがすれ違います

免責事項:この記事は「元の記事CSDNのブロガーLZAのqq_895860866で、CC 4.0 BY-SAの著作権契約書に従って、再現し、元のソースのリンクと、この文を添付してください。
オリジナルリンクします。https://blog.csdn.net/ezconn/article/details/101321564

JNIによるJavaおよびC / C ++このミドルウェア、私たちはお互いの間の伝送の配列を達成することができ、参考のために、私はいくつかの方法を提供するためにここにいます。

最初の:Javaは、処理後、C / C ++にJNIを通過し、その後Java配列戻るにコピーされ、
Javaのネイティブメソッドの定義:

公共ネイティブのint [] arrEncode(INT [] ARR)は、
Cコードを実現します。

#include <jni.h中>


JNIEXPORT jintArray JNICALL Java_com_example_arrtoc_MainActivity_arrEncode
(JNIEnvのENV *、jオブジェクトOBJ、jintArray javaArr){
// Java配列の長さ取得
INT =な長さ(ENV *) - > GetArrayLength(ENV、javaArrを);

// Java配列C配列を作成し、配列はJava配列Cに変換される
// JINT *(* GetIntArrayElements)(* JNIEnvの、jintArrayとき、jboolean *);
INT * arRP =(* ENV) - > GetIntArrayElements(ENV、javaArr、0);

//処理アレイ要素値+ 10
INT I、
(I = 0、I <な長さ、I ++)のために{
*(arRP + I)+ = 10;
}
Cは配列つの要素のJava配列にコピーされ、//
( ENV *) - > SetIntArrayRegion(ENV、javaArr、0、な長さ、arRP);

戻りjavaArr;
}
第二の実施形態:Cで直接作動要素、その後Java配列にC配列をコピーして、Java配列を更新します。

Javaのネイティブメソッドの宣言

ネイティブボイドarrEncode公開(INT [] ARR);
Cコードの実装

#include <jni.h中>


JNIEXPORT JNICALL Java_com_example_arrtoc_MainActivity_arrEncodeがvoid
(* JNIEnvのENV、jオブジェクトOBJ、jintArray javaArr){
// Java配列の長さ取得
INT =な長さ(ENV *)を- > GetArrayLength(ENV、javaArr);

// Java配列C配列を作成し、配列はJava配列Cに変換される
// JINT *(* GetIntArrayElements)(* JNIEnvの、jintArrayとき、jboolean *);
INT * arRP =(* ENV) - > GetIntArrayElements(ENV、javaArr、0);

//処理アレイ要素値+ 10
INT I、
(I = 0、I <な長さ、I ++)のために{
*(arRP + I)+ = 10;
}
Cは配列つの要素のJava配列にコピーされ、//
( ENV *)は- > SetIntArrayRegion(ENV、javaArr、0、な長さ、arRP);
}
第三:Cコードの新しいJava配列、及びその後は、JavaのJavaに戻される配列内の配列内の要素Cをコピーします。

Javaのネイティブメソッドの定義:

ネイティブのintパブリック[] arrEncode(INT [] ARR);
Cコードの実装:

#include <jni.h中>


JNIEXPORT jintArray JNICALL Java_com_example_arrtoc_MainActivity_arrEncode
(JNIEnvのENV *、jオブジェクトOBJ、jintArray javaArr){
// Java配列の長さ取得
INT =な長さ(ENV *) - > GetArrayLength(ENV、javaArrを);

// Java配列C配列を作成し、配列はJava配列Cに変換される
// JINT *(* GetIntArrayElements)(* JNIEnvの、jintArrayとき、jboolean *);
INT * arRP =(* ENV) - > GetIntArrayElements(ENV、javaArr、0);
// Java配列の作成
jintArray newArr =(ENV *) - > NewIntArray(ENV、な長さの);

// 10個のプロセスは、配列要素の値を追加
I int型、
(I = 0、I <な長さ、I ++)のために{
*(arRPをI +)+ = 10;
}
// Cは配列つの要素Java配列にコピーされ
(ENV *) - > SetIntArrayRegion(ENV、newArr、0、な長さ、arRP);

戻りnewArr;

}
第四:種によって実装JNI ReleaseArrayElements方法:

このメソッドの最後のパラメータは、パターンです。

0:Java配列が更新され、C / C ++の配列をリリースしています。
JNI_ABORT:Java配列が更新されていませんが、C / C ++の配列のリリース。
JNI_COMMIT:Java配列の更新は、C / C ++の配列放出しない(関数が実行され、配列はまだリリースされます)。
----------------
免責事項:この記事はCSDNブロガー「LZA qq_895860866の元記事である、CC 4.0 BY-SAの著作権契約書に従って、再現し、元のソースと、このリンクを添付してください声明。
オリジナルリンクします。https://blog.csdn.net/ezconn/article/details/101321564

おすすめ

転載: www.cnblogs.com/qianheng/p/12202685.html