【发布时间】:2015-04-06 12:23:17
【问题描述】:
我正在开发一个具有视频聊天功能的模块。为此,我正在使用 Webrtc。我非常接近完成这项工作,但我在打电话时遇到了一个问题。
服务器总是返回
{"params": {"messages": []}, "result": "FULL"}
在此之后我遇到了另一个问题,例如,
java.lang.UnsatisfiedLinkError: Native method not found: org.webrtc.PeerConnectionFactory.initializeFieldTrials:(Ljava/lang/String;)V
首先我遇到了 jingle 本机库的问题。我也将它集成到 jni 目录中。还更新了 peerconnection_jni.cc 文件但同样的错误..
我也可以附加 peerconnection_jni.cc 文件(如果需要)。
我也在谷歌上搜索过。但没有得到实际输出。谁能帮帮我?
更新:
这是我的 peerconnection_jni.cc 的代码
extern "C" {
JNIEXPORT void JNICALL Java_org_webrtc_PeerConnectionFactory_initializeFieldTrials
(JNIEnv* evn,jclass _class,jstring j_trials_init_string) {
field_trials_init_string = NULL;
if (j_trials_init_string != NULL) {
const char* init_string =
jni->GetStringUTFChars(j_trials_init_string, NULL);
int init_string_length = jni->GetStringUTFLength(j_trials_init_string);
field_trials_init_string = new char[init_string_length + 1];
rtc::strcpyn(field_trials_init_string, init_string_length + 1, init_string);
jni->ReleaseStringUTFChars(j_trials_init_string, init_string);
LOG(LS_INFO) << "initializeFieldTrials: " << field_trials_init_string;
}
webrtc::field_trial::InitFieldTrialsFromString(field_trials_init_string);
}
}
这是我的 Logcat 输出。
04-06 19:20:57.041: E/AppRTCDemoActivity(26645): Fatal error: Native method not found: org.webrtc.PeerConnectionFactory.initializeFieldTrials:(Ljava/lang/String;)V
04-06 19:20:57.041: E/AppRTCDemoActivity(26645): java.lang.UnsatisfiedLinkError: Native method not found: org.webrtc.PeerConnectionFactory.initializeFieldTrials:(Ljava/lang/String;)V
04-06 19:20:57.041: E/AppRTCDemoActivity(26645): at org.webrtc.PeerConnectionFactory.initializeFieldTrials(Native Method)
04-06 19:20:57.041: E/AppRTCDemoActivity(26645): at org.appspot.apprtc.PeerConnectionClient.createPeerConnectionFactoryInternal(PeerConnectionClient.java:268)
04-06 19:20:57.041: E/AppRTCDemoActivity(26645): at org.appspot.apprtc.PeerConnectionClient.access$18(PeerConnectionClient.java:257)
04-06 19:20:57.041: E/AppRTCDemoActivity(26645): at org.appspot.apprtc.PeerConnectionClient$1.run(PeerConnectionClient.java:222)
04-06 19:20:57.041: E/AppRTCDemoActivity(26645): at android.os.Handler.handleCallback(Handler.java:725)
04-06 19:20:57.041: E/AppRTCDemoActivity(26645): at android.os.Handler.dispatchMessage(Handler.java:92)
04-06 19:20:57.041: E/AppRTCDemoActivity(26645): at android.os.Looper.loop(Looper.java:137)
04-06 19:20:57.041: E/AppRTCDemoActivity(26645): at org.appspot.apprtc.util.LooperExecutor.run(LooperExecutor.java:57)
【问题讨论】:
-
从哪里调用 initializeFieldTrials() 方法??并且在调用该方法之前是否加载了本机库??
-
我正在从 PeerConnectionClient.java 调用 initializeFieldTrials 方法 > createPeerConnectionFactoryInternal() 方法。是的,我正在使用此类顶部的“static { System.loadLibrary("jingle_peerconnection_so");}”加载该库。
-
好吧..如果您使用 JNI 方法,那么该方法名称应该包含一些命名约定。您是否使用过该命名约定?以及您通过该方法的哪个领域?我认为字符串..对吗?
-
是的,它的字符串。检查我已经更新了我的问题并附加了该方法的 peerconnection_jni.cc 代码。
-
你的方法命名约定应该是,JNIEXPORT void JNICALL Java_org_webrtc_PeerConnectionFactory_initializeFieldIdTrials(JNIEnv* evn,jclass _class,jstring j_trials_init_string),你的java方法应该是静态的。如果该方法在 java 中不是静态的,则在 jni 方法中使用 jobject 而不是 jclass。
标签: android java-native-interface webrtc videochat peer-connection