[英]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.