如何在Android中将java代码中的字符串发送到本机C
我正在开发android应用程序,其中我使用NDK做了一些小事情。如何获取从java代码发送到本机C的字符串。我想获取从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
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);
}