2017-05-16 137 views
0

Android Studio 2.3.2 Gradle实验0.9.2 最后一个NDK。 我在C中编写了一个小函数,它通过Java中的JNI调用,但返回一个字符串,该字符串不应该在那里。 这是C函数:android ndk c函数返回奇怪值

char * text() { 
     char * txt = "a"; 
     char * ret = malloc(strlen(a)+2); 
     strcat(ret,txt); 
     strcat(ret,"b"); 
     return ret; 
    } 

这是JNI C返回到Java的

JNIEXPORT jstring JNICALL 
     Java_com_myapp_Main_getMsg(JNIEnv *env, jobject instance, jstring var) 
    { 
     char * msg = text(); 

     return (*env)->NewStringUTF(env, msg); 
    } 

这是Java调用:

static { 
    System.loadLibrary("myapp"); 
} 
public native String getMsg(String var); 

String stringreturnedfromC = getMsg("eee");//eee is not used 

这个节目是:

_Main_getMsg ab

但应该只返回“ab”。

这是一个奇怪的行为。为什么?我怎样才能得到正确的字符串?

+1

'的strlen(一)'什么是?什么是len? – greenapps

+0

用strcpy()替换第一个strcat()。 – greenapps

+0

#greenapps strlen返回字符串的长度,我必须用它来分配内存。 我尝试替换strcat()。 – Daniele

回答

0

注意到你的函数text()不正确。

做这样的事情

char * text() { 
    char * txt = "a"; 
    char * ret = (char *)malloc(strlen(txt)); //malloc(strlen(a)+2); is incorrect statment 
    strcat(ret,txt); 
    strcat(ret,"b"); 
    return ret; 
} 
+0

This return _Main9ab @greenapps的建议是正确的。 – Daniele

+0

根本不是。你的'malloc()'只返回1个不确定值的字节。使用'strcat()'将* 2-char *字符串添加到该字符串中(字符串“a”包含*两个*字符 - “a”字符和终止的'\ 0'字符)已经足够糟糕了,但由于'ret'指向的内存内容是不确定的,因此来自'“a”'的这两个字符的最终目的地是未知的。然后,另一个'strcat()'试图增加更多的东西,使其不适合第一个地方,最终被写入某个未知的位置。 –

+0

它会工作 - 即使你分配像(char *)malloc(0);然后strcat(ret,“更长的东西”) - [mac os/xcode]。有人可以尝试在Windows上运行它吗? –