जवाबों:
यदि आपने दस्तावेज़ीकरण की जांच की है और अभी भी प्रश्न हैं जो आपके प्रारंभिक प्रश्न का हिस्सा होना चाहिए। इस मामले में, उदाहरण में JNI फ़ंक्शन कई सरणियों का निर्माण करता है। बाहरी सरणी JNI फ़ंक्शन के साथ बनाने वाले एक 'ऑब्जेक्ट' सरणी से मिलकर बनता है NewObjectArray()
। जेएनआई के दृष्टिकोण से, यह सभी दो आयामी सरणी है, एक ऑब्जेक्ट सरणी जिसमें अन्य आंतरिक सरणियों की संख्या होती है।
लूप के लिए निम्नलिखित आंतरिक सरणियों का निर्माण करता है जो JNI फ़ंक्शन का उपयोग करते हुए [int] प्रकार के होते हैं NewIntArray()
। यदि आप बस एक ही आयामी सरणी के ints को वापस करना चाहते हैं, तो NewIntArray()
फ़ंक्शन वह है जो आप रिटर्न मान बनाने के लिए उपयोग करेंगे। यदि आप स्ट्रिंग्स के एकल आयामी सरणी बनाना चाहते थे, तो आप NewObjectArray()
फ़ंक्शन का उपयोग करेंगे लेकिन कक्षा के लिए एक अलग पैरामीटर के साथ।
चूँकि आप एक अंतर सरणी वापस करना चाहते हैं, तो आपका कोड कुछ इस तरह दिखने वाला है:
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;
}
अगर कोई जानना चाहता है कि स्ट्रिंग [] सरणी कैसे लौटाएं:
जावा कोड
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 [] कैसे पास कर सकते हैं। लेकिन यहां एक उदाहरण दिया गया है कि हम एक जॉब कैसे वापस कर सकते हैं। यह उदाहरण के लिए स्थितियों के लिए सहायक हो सकता है: जब किसी को x और y बिंदुओं के साथ कुछ रेखा खींचने के लिए 2D प्रारूप में डेटा वापस करने की आवश्यकता होती है। नीचे दिए गए उदाहरण से पता चलता है कि कैसे एक jobjectArray निम्नलिखित प्रारूप के रूप में डेटा वापस कर सकता है:
जावा इनपुट जेएनआई के लिए:
एरे [ Arraylist
x फ्लोट पॉइंट्स का] [ Arraylist
y फ्लोट पॉइंट्स का]
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;