gpt4 book ai didi

java - 从 Android Java 调用 ndk c++ 函数后,字符串得到一个奇怪的形式

转载 作者:行者123 更新时间:2023-11-27 23:57:06 25 4
gpt4 key购买 nike

这是我从 Android 调用的函数:

String entityID = "414";
app.JoinConference(entityID);

我的 C++ jni 文件中有这段代码:

JNIEXPORT void Java_com_vidyo_vidyosample_VidyoSampleApplication_JoinConference(jstring eid)
{
FUNCTION_ENTRY;
LOGI("GuiOnOutEvent errorNOT JoinConference() enter\n");
VidyoClientPortalServiceJoinConferenceRequest createSchedRoomReq = {0};
createSchedRoomReq.typeRequest = VIDYO_CLIENT_PRIVATE_SOAP_JOIN_CONFERENCE;
LOGI("GuiOnOutEvent errorNOTJoinConference enter3: %s \n", eid);
// createSchedRoomReq.entityID = eid;
strlcpy(&createSchedRoomReq.entityID, eid, sizeof(eid));
LOGI("errorNOTJoinConference request is: %d pin %s + link: %d ", createSchedRoomReq.typeRequest,
createSchedRoomReq.entityID, VIDYO_CLIENT_PRIVATE_IN_EVENT_VCSOAP);
LOGI("errorNOTJoinConference sizeof : %d", sizeof(VidyoClientPrivateSoapInEventCreateScheduledRoom));
VidyoClientSendEvent( VIDYO_CLIENT_PRIVATE_IN_EVENT_VCSOAP, &createSchedRoomReq, sizeof(VidyoClientPortalServiceJoinConferenceRequest));
LOGI("GuiOnOutEvent errorNOTJoinConference EXIT\n");
FUNCTION_EXIT;
}

我做错了什么?注销 eid 的带有“enter3”的行,注销以下内容而不是“414”:

01-24 18:04:29.310: I/VidyoMobile app/src/main/jni/ndkVidyoSample.c(12976): GuiOnOutEvent errorNOTJoinConference enter3: |9Ǵ 

我应该在 ndk 函数的方法参数中使用什么来代替 jstring?或者我是否需要将它从 android 和 ndk 更改为某种字符数组?

最佳答案

你不能直接将 jstring eid 作为参数传递给 printf 之类的函数,你需要先从中获取 const char*,比如:

const char *s = (*env)->GetStringUTFChars(env, eid, 0);

使用 s 作为 LOGI 的参数,然后当不再需要 s 时:

(*env)->ReleaseStringUTFChars(env, eid, s);

还有为什么你的 jni 函数没有 JNIEnv *env 参数?静态本地方法签名应该是:

JNIEXPORT jstring JNICALL
....... (JNIEnv *env, jclass type, jstring str);

对于非静态:

JNIEXPORT jstring JNICALL
....... (JNIEnv *env, jobject instance, jstring str);

有了 android studio 对 jni 代码的支持,现在 super 简单,你可以用 java 代码编写你的原生函数,例如:

public native void test(String s);

然后IDE将其标记为红色,点击alt+enter并选择生成原生函数,如下所示:

JNIEXPORT void JNICALL
Java_com_example_hellojni_HelloJni_test(JNIEnv *env, jobject instance, jstring s_) {
const char *s = (*env)->GetStringUTFChars(env, s_, 0);

// TODO

(*env)->ReleaseStringUTFChars(env, s_, s);
}

关于java - 从 Android Java 调用 ndk c++ 函数后,字符串得到一个奇怪的形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41834269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com