2011-08-21 13 views
7

को पहचान नहीं सकते हैं मैंने जावा से सी तक चार सरणी पारित करने का प्रयास किया। मैंने इसे लागू करने के तरीके को गुमराह किया है। लेकिन जब मैंने सरणी के मान तक पहुंचने का प्रयास किया, तो मान सही नहीं था।एंड्रॉइड जावा जेएनआई और सी चार सरणी मान

वास्तव में, मैंने सरणी को एक चरित्र देने की कोशिश की। बस buffer[i]='z' की तरह, और परिणाम एंड्रॉइड में सही है।

बीटीडब्ल्यू, जो मूल्य मैं चाहता था वह आरएस 232 द्वारा भेजा गया मूल्य था। Rs232 से मान ठीक था।

किसी ने मुझे बाइटियर का उपयोग करने के लिए कहा। क्या यह काम करेगा? मैं की है कि RS232 से मूल्य bytearray में दुकान नहीं किया जा सका डर था ....

Java

public native int OpenPort(int portnum,int brates); 
public native int ClosePort(int portnum); 
public native int READ(char[] databuffer); 

public char[] buffer=new char[40]; 

int i; 

for(i=0;i<40;i++) 
    buffer[i]='s'; //initialization 

OpenPort(16,9600); // A function to open the rs232 port 

while (i<1000) 
{ 
    READ(buffer); 
    i++; 
} 

JNI.c

JNIEXPORT jint JNICALL Java_com_example_ndk_Vehicles_READ(JNIEnv *env, jclass 
cls,jcharArray databuffer) 
{ 

    char tmp[40]; 
    jchar *buffer=(*env)->GetCharArrayElements(env,databuffer,0); 
    memset(tmp,0,sizeof(tmp)); 
    PollComport(16,tmp,40); //will the problem here ? This function need a unsigned char[] 
          //,but in the c program I wrote , char[] was ok for this. 
    memcpy(buffer,tmp,40); 

    (*env)->ReleaseCharArrayElements(env, databuffer, buffer, 0); 

    return 0; 
} 
+0

आपका प्रश्न क्या है? – jogabonito

+0

यदि आप ** जावा से सी से चार सरणी पास करना चाहते हैं ** मैं आपको बाइट सरणी का उपयोग करना चाहता हूं तो बस उन्हें चार * –

+0

के रूप में पास करने की सलाह दूंगा, फिर इस ** jbyteArray jb का उपयोग करें; जेबी = (* एनवी) -> न्यूबीटएरे (एनवी, फिनफो.स्ट_साइज); (* env) -> SetByteArrayRegion (env, jb, 0, \t \t finfo.st_size, (jbyte *) m); बंद (एफडी); ** सरणी को ** (* env) -> रिलीजबेटएरेरेमेंट्स (एनवी, जेबी, (जेबीटी *) एम, 0) द्वारा स्पष्ट रूप से मुक्त किया जा सकता है; ** –

उत्तर

0

यहां एक त्वरित उदाहरण है

public native int play(String filename_main, String filename_prev, int main_x, int main_y, int main_width, int main_height, int preview_x, int preview_y, int preview_width, int preview_height); 

मानचित्र

int play(char* filename_main, char* filename_preview, int main_x, int main_y, int main_width, int main_height, int preview_x, int preview_y, int preview_width, int preview_height) 

इस जेएनआई कॉल का उपयोग कर।

JNIEXPORT jint JNICALL Java_com_rtrk_demo_PELib_play(JNIEnv *env, jobject obj, jstring main_video, jstring prev_video, jint main_x, jint main_y, jint main_width, jint main_height, jint prev_x, jint prev_y, jint prev_width, jint prev_height) 
{ 
LOGI("JNICALL - Java_com_rtrk_demo_PELib_play(filename)\n"); 

const char* utf_main_video = env->GetStringUTFChars(main_video, 0); 
const char* utf_prev_video = env->GetStringUTFChars(prev_video, 0); 
char* file_main_video = (char*) malloc(strlen(utf_main_video) * sizeof(char) +1); 
char* file_prev_video = (char*) malloc(strlen(utf_prev_video) * sizeof(char) +1); 
strcpy(file_main_video, utf_main_video); 
strcpy(file_prev_video, utf_prev_video); 
LOGI("JNICALL - filenames: %s\t%s\n", file_main_video, file_prev_video); 
env->ReleaseStringUTFChars(main_video, utf_main_video); 
env->ReleaseStringUTFChars(prev_video, utf_prev_video); 
LOGI("###JNICALL RET - Java_com_rtrk_demo_PELib_play(%s, %s)\n", file_main_video, file_prev_video); 

int retVal = play(file_main_video, file_prev_video, (int)main_x, (int)main_y, (int)main_width, (int)main_height, (int)prev_x, (int)prev_y, (int)prev_width, (int)prev_height); 
free(file_main_video); 
free(file_prev_video); 
return retVal; 
} 
0

क्योंकि GetCharArrayElements() जावा सरणी की एक प्रतिलिपि बनाने और आप प्रतिलिपि करने के लिए एक सूचक हाथ के बजाय करने के लिए अनुमति दी है। अपने कोड में, आप सूचक करने वाली बूलियन तर्क यह है कि आपको बता होगा अगर एक प्रति किया गया था के लिए अशक्त में गुजर रहे हैं:

jchar *buffer=(*env)->GetCharArrayElements(env,databuffer,0); 

तो आप की संभावना एक प्रति जब आप समाप्त कर त्याग दिया जाता है पर काम कर रहे हैं। GetCharArrayElements() के बजाय, C++ में अपने स्थानीय सरणी पर काम करें और उन्हें कॉपी करने के लिए SetCharArrayRegion() का उपयोग करें।

संबंधित मुद्दे