Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中将java代码中的字符串发送到本机C_Java_Android_C_Android Ndk_Java Native Interface - Fatal编程技术网

如何在Android中将java代码中的字符串发送到本机C

如何在Android中将java代码中的字符串发送到本机C,java,android,c,android-ndk,java-native-interface,Java,Android,C,Android Ndk,Java Native Interface,我正在开发android应用程序,其中我使用NDK做了一些小事情。如何获取从java代码发送到本机C的字符串。我想获取从java代码发送的本机C代码中的值 这是我在活动中编写的代码 observer("test@gmail.com"); public native void observer(String email); 这是本机代码吗 void Java_pl_pelotasplus_actionafteruninstall_MainActivity_observer(JNIEnv* env

我正在开发android应用程序,其中我使用NDK做了一些小事情。如何获取从java代码发送到本机C的字符串。我想获取从java代码发送的本机C代码中的值

这是我在活动中编写的代码

observer("test@gmail.com");
public native void observer(String email);
这是本机代码吗

void
Java_pl_pelotasplus_actionafteruninstall_MainActivity_observer(JNIEnv* env, jobject thiz) {
    // I want to get email.. How to get
}
提前感谢。

试试这个:

 void Java_pl_pelotasplus_actionafteruninstall_MainActivity_observer(JNIEnv* env, jobject thiz, jstring jstr) {
    char* email = jstringToCharArray(env, jstr);
}
Jstringtocharray:

    char* jstringToCharArray(JNIEnv* env, jstring jstr)
{

    char* rtn = NULL;
    jclass clsstring = env->FindClass("java/lang/String");
    jstring strencode = env->NewStringUTF("utf-8");
    jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
    jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
    jsize alen = env->GetArrayLength(barr);
    jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
    if (alen > 0)
    {
    rtn = (char*)malloc(alen + 1);

    memcpy(rtn, ba, alen);
    rtn[alen] = 0;
    }
始终使用生成标题,这样您就不会有任何错误。还建议将其粘贴到批处理文件中,以便轻松更新

从源文件夹:

...\src> javah pl.pelotasplus.actionafteruninstall.MainActivity
将生成以下.h文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for pl_pelotasplus_actionafteruninstall_MainActivity */

#ifndef _Included_pl_pelotasplus_actionafteruninstall_MainActivity
#define _Included_pl_pelotasplus_actionafteruninstall_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     pl_pelotasplus_actionafteruninstall_MainActivity
 * Method:    observer
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_pl_pelotasplus_actionafteruninstall_MainActivity_observer
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

签名看起来是错误的,你用javah生成了吗?不,当我用它传递电子邮件时,本机c方法的签名是什么?如何用本机代码访问它?好的,我已经更改了答案谢谢你的帮助。这段代码有很多问题。没有
free()
在电子邮件上,没有
ReleaseByteArrayElements
ba
上。
NewStringUTF
FindClass
可以有一个
DeleteLocalRef
,如果它是从如何使用*nativeEmailString或nativeEmailString?你说的“如何使用”是什么意思?在这一点上,它是一个本机c字符串,所以你想怎么做就怎么做
GetStringUTFChars
的问题是它产生了修改过的UTF-8,本机代码可能无法正确使用它,毕竟它是为JNI发明的。(注意:对于许多字符串,修改后的UTF-8和UTF-8是相同的。如果所有字符串都是相同的,则在它们不是时抛出异常。)如果确实要将任何Java字符串转换为UTF-8,请使用string.getBytes。@TomBlodget有趣的是,您是否有解释“修改”的链接
GetStringUTFChars
的UTF-8结果的性质?有一本标准书《Java本机接口:程序员指南和规范》,作者是盛亮(Sun)和Orcale and Andriod。
JNIEXPORT void JNICALL Java_pl_pelotasplus_actionafteruninstall_MainActivity_observer
      (JNIEnv *env, jobject thiz, jstring email){

   const char *nativeEmailString = (*env)->GetStringUTFChars(env, email, 0);

   // use your string

   (*env)->ReleaseStringUTFChars(env, email, nativeEmailString);
}