어레이를 JNI에서 Java로 되돌리는 방법
안드로이드 NDK를 사용하려고 합니다.
어레이를 반환하는 방법이 있습니까?int[]
JNI에서 Java로 작성되었습니다.만약 그렇다면 JNI 기능에 대한 간단한 예를 제시해 주십시오.
-감사합니다. -감사합니다.
문서를 검토했는데도 질문이 있는 경우 첫 번째 질문의 일부로 간주됩니다.이 경우 예의 JNI 함수는 다수의 어레이를 작성합니다.외부 배열은 JNI 함수로 생성하는 '개체' 배열로 구성됩니다.NewObjectArray()
JNI의 관점에서 보면, 이 모든 것은 2차원 어레이이며, 다른 다수의 내부 어레이를 포함하는 객체 어레이입니다.
다음 for loop은 JNI 함수를 사용하여 int[] 유형의 내부 어레이를 만듭니다.NewIntArray()
단일 차원 배열의 int를 반환하고 싶은 경우NewIntArray()
함수는 반환값을 생성하기 위해 사용하는 것입니다.Strings의 단일 차원 배열을 작성하려면NewObjectArray()
클래스에 대해 다른 매개 변수를 사용합니다.
int 어레이를 반환하고 싶기 때문에 코드는 다음과 같습니다.
JNIEXPORT jintArray JNICALL Java_ArrayTest_initIntArray(JNIEnv *env, jclass cls, int size)
{
jintArray result;
result = (*env)->NewIntArray(env, size);
if (result == NULL) {
return NULL; /* out of memory error thrown */
}
int i;
// fill a temp structure to use to populate the java int array
jint fill[size];
for (i = 0; i < size; i++) {
fill[i] = 0; // put whatever logic you want to populate the values here.
}
// move from the temp structure to the java structure
(*env)->SetIntArrayRegion(env, result, 0, size, fill);
return result;
}
String [ ]어레이를 반환하는 방법을 알고 싶은 경우:
자바 코드
private native String[] data();
토종 수출
JNIEXPORT jobjectArray JNICALL Java_example_data() (JNIEnv *, jobject);
네이티브 코드
JNIEXPORT jobjectArray JNICALL
Java_example_data
(JNIEnv *env, jobject jobj){
jobjectArray ret;
int i;
char *message[5]= {"first",
"second",
"third",
"fourth",
"fifth"};
ret= (jobjectArray)env->NewObjectArray(5,
env->FindClass("java/lang/String"),
env->NewStringUTF(""));
for(i=0;i<5;i++) {
env->SetObjectArrayElement(
ret,i,env->NewStringUTF(message[i]));
}
return(ret);
}
링크 : http://www.coderanch.com/t/326467/java/java/Returning-String-array-program-Java
이 질문은 첫 번째 답변에서 jobjectArray를 통해 int[]를 전달하는 방법에 대해 이미 설명되어 있습니다.그러나 다음은 데이터 목록을 포함하는 jobjectArray를 반환하는 예입니다.예를 들어 x 및 y 점으로 선을 그리기 위해 데이터를 2D 형식으로 반환해야 하는 경우에 유용합니다.다음 예시는 jobjectArray가 다음 형식으로 데이터를 반환하는 방법을 보여 줍니다.
JNI에 대한 Java 입력:
어레이[Arraylist
x 부동 소수점 수][Arraylist
y 부동 소수점 수]
Java에 대한 JNI 출력:
jobjectArray
[Arraylist
x 부동 소수점 수][Arraylist
y 부동 소수점 수]
extern "C" JNIEXPORT jobjectArray JNICALL
_MainActivity_callOpenCVFn(
JNIEnv *env, jobject /* this */,
jobjectArray list) {
//Finding arrayList class and float class(2 lists , one x and another is y)
static jclass arrayListCls = static_cast<jclass>(env->NewGlobalRef(env->FindClass("java/util/ArrayList")));
jclass floatCls = env->FindClass("java/lang/Float");
//env initialization of list object and float
static jmethodID listConstructor = env->GetMethodID(arrayListCls, "<init>", "(I)V");
jmethodID alGetId = env->GetMethodID(arrayListCls, "get", "(I)Ljava/lang/Object;");
jmethodID alSizeId = env->GetMethodID(arrayListCls, "size", "()I");
static jmethodID addElementToList = env->GetMethodID(arrayListCls, "add", "(Ljava/lang/Object;)Z");
jmethodID floatConstructor = env->GetMethodID( floatCls, "<init>", "(F)V");
jmethodID floatId = env->GetMethodID(floatCls,"floatValue", "()F");
//null check(if null then return)
if (arrayListCls == nullptr || floatCls == nullptr) {
return 0;
}
// Get the value of each Float list object in the array
jsize length = env->GetArrayLength(list);
//If empty
if (length < 1) {
env->DeleteLocalRef(arrayListCls);
env->DeleteLocalRef(floatCls);
return 0;
}
// Creating an output jObjectArray
jobjectArray outJNIArray = env->NewObjectArray(length, arrayListCls, 0);
//taking list of X and Y points object at the time of return
jobject xPoint,yPoint,xReturnObject,yReturnObject;
//getting the xList,yList object from the array
jobject xObjFloatList = env->GetObjectArrayElement(list, 0);
jobject yObjFloatList = env->GetObjectArrayElement(list, 1);
// number of elements present in the array object
int xPointCounts = static_cast<int>(env->CallIntMethod(xObjFloatList, alSizeId));
static jfloat xReturn, yReturn;
jobject xReturnArrayList = env->NewObject(arrayListCls,listConstructor,0);
jobject yReturnArrayList = env->NewObject(arrayListCls,listConstructor,0);
for (int j = 0; j < xPointCounts; j++) {
//Getting the x points from the x object list in the array
xPoint = env->CallObjectMethod(xObjFloatList, alGetId, j);
//Getting the y points from the y object list in the array
yPoint = env->CallObjectMethod(yObjFloatList, alGetId, j);
//Returning jobjectArray(Here I am returning the same x and points I am receiving from java side, just to show how to make the returning `jobjectArray`)
//float x and y values
xReturn =static_cast<jfloat >(env->CallFloatMethod(xPoint, floatId,j));
yReturn =static_cast<jfloat >(env->CallFloatMethod(yPoint, floatId,j));
xReturnObject = env->NewObject(floatCls,floatConstructor,xReturn);
yReturnObject = env->NewObject(floatCls,floatConstructor,yReturn);
env->CallBooleanMethod(xReturnArrayList,addElementToList,xReturnObject);
env->CallBooleanMethod(yReturnArrayList,addElementToList,yReturnObject);
env->SetObjectArrayElement(outJNIArray,0,xReturnArrayList);
env->SetObjectArrayElement(outJNIArray,1,yReturnArrayList);
__android_log_print(ANDROID_LOG_ERROR, "List of X and Y are saved in the array","%d", 3);
}
return outJNIArray;
간단한 해결책은 어레이 데이터를 C에서 파일에 쓴 후 Java에서 파일에 액세스하는 것입니다.
언급URL : https://stackoverflow.com/questions/1610045/how-to-return-an-array-from-jni-to-java
'sourcecode' 카테고리의 다른 글
폴더 내용을 삭제하려면 어떻게 해야 합니까? (0) | 2022.09.11 |
---|---|
한정된 수의 고유 값으로 선택 (0) | 2022.09.11 |
Node.js(JavaScript)에서 대기하려면 어떻게 해야 합니까?나는 일정 기간 동안 일시 정지할 필요가 있다. (0) | 2022.09.11 |
테스트를 구성하기 위한 PHPUnit 베스트 프랙티스 (0) | 2022.09.11 |
Spark java를 사용하여 mariadb에서 데이터를 읽는 방법 (0) | 2022.09.11 |