为新的 linphone SDK 添加自定义函数。
在开发人员的指导下,我通过在 bellesip C 代码中添加小函数来构建 liblinphone android sdk。还在 linphonecore_jni.cc 中添加了相关条目并构建了 linphone-android-sdk。在文档页面上,它说将为本机函数自动生成包装器。但是在构建 AAR 并将其添加到 linphone 项目后,我在 Core 方法中看不到我的方法。我尝试了-DENABLE_JAVA_WRAPPER=NO
和 -DENABLE_JAVA_WRAPPER=YES
.
我尝试添加
JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneCoreImpl_setCutomFunction(JNIEnv *env, jobject thiz, jlong lc, jint tik, jint tik_size) {
settiks(tiks, tik_size);
}linphonecore_jni
我希望我可以在 linphone java 代码中调用本机方法。除我在核心中的自定义方法外,所有方法都在填充。 除了将 linphonedk AAR 库文件添加到 linphone 项目之外,还有什么额外的步骤吗?
为了能够为 C 函数自动生成 JNI 包装器,您必须将其包含在 linphone 项目中,而不是 belle-sip 中。
确保在 Linphone 库的头文件中按照 DOXYGEN 标准正确记录它。
我认为我们应该使用新的包装器作为Linphone开发人员的建议。
所有文件,如核心.java,linphone_jni.cc...将在构建 Linphonedk 时自动生成。据我了解,生成规则由 .mustache 文件定义。
像linphonecore_jni.cc,LinphoneCore这样的旧文件.java不再使用。也许您正在修改这些旧文件。
在旧到你的新方法生成到核心.java,linphone_jni.cc...您必须将它们添加到正确的 .c 和 .h 文件中,具有正确的格式和注释。
例如:我想在 Core.java 中添加以下方法:
Call inviteAddressToConferenceWithParams(Address var1, CallParams var2);
使用方法映射
JNIEXPORT jobject JNICALL Java_org_linphone_core_CoreImpl_createConferenceWithParams(JNIEnv *env, jobject thiz, jlong ptr, jobject params)
在linphone_jni.cc
我所要做的就是添加linphone/include/linphone/core.h:
/**
* Some texts
*
* @param[in] lc #LinphoneCore object
* @param[in] addr The destination of the call (sip address).
* @param[in] params Call parameters
* @return A #LinphoneCall object or NULL in case of failure
* @ingroup call_control */
LINPHONE_PUBLIC LinphoneCall * linphone_core_invite_address_to_conference_with_params(LinphoneCore *lc, const LinphoneAddress *addr, LinphoneCallParams *params);
在linphonecore.c中:
LinphoneCall * linphone_core_invite_address_to_conference_with_params(LinphoneCore *lc, const LinphoneAddress *addr, LinphoneCallParams *params) {
// Add your code here
return /* return what you want */;
}
然后通过以下方式构建 linphonedk:
cmake --build .
之后,将生成 Core.java、linphone_jni.cc 中的所有相关代码。注意注释。没有它们,代码将不会生成。
我展示了一个在 .aar 文件中的 Call.Java 中添加新功能的示例,因为新版本的 Linphone 不再使用 linphonecore_jni.cc 文件。
打开下面的文件:
liblinphone/include/linphone/api/c-call.h
添加新函数声明:
/**
* Enables or disable echo cancellation for this call
* @param call the #LinphoneCall object @notnil
* @param enable wether to enable some functionality or not.
**/
LINPHONE_PUBLIC void linphone_call_testfunction(LinphoneCall *call, bool_t enable);
现在打开下面的文件:
liblinphone/src/c-wrapper/api/c-call.cpp
在文件中添加新的函数定义:
bool_t linphone_call_testfunction (const LinphoneCall *call, bool_t enable) {
return Call::toCpp(call)->testFunction();
}
现在它将生成 build/WORK/android-armv7/Build/linphone/wrappers/java/src/linphone_jni.cc 具有以下函数:
JNIEXPORT jboolean JNICALL Java_org_linphone_core_CallImpl_testfunction(JNIEnv *env, jobject thiz, jlong ptr, jboolean enable) {
LinphoneCall *cptr = (LinphoneCall*)ptr;
if (cptr == nullptr) {
bctbx_error("Java_org_linphone_core_CallImpl_testfunction's LinphoneCall C ptr is null!");
return 0;
}
jboolean jni_result = (jboolean)linphone_call_testfunction(cptr, (bool_t)enable));
return jni_result;
}
现在确保再有一个文件生成 build/WORK/android-armv7/Build/linphone/wrappers/java/java/org/linphone/core/Call.java 带有函数声明:
public boolean testfunction();
现在要在 Java 代码中调用此函数,请将最新的 .aar 文件复制到 android studio 中的 linphone-android 项目中。右键单击项目>从磁盘重新加载,然后尝试访问该功能。这个程序对我非常有效。