繁体   English   中英

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

[英]String gets a weird form after calling a ndk c++ function from Android Java

这是我从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更改为某种char数组?

您不能直接将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代码的支持,现在超级简单,您可以用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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM