向新的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代码中调用本机方法。除了我的核心自定义方法外,所有方法都在填充。 除了将linphonesdk AAR库文件添加到linphone项目之外,还有什么其他步骤。
答案 0 :(得分:0)
要能够为C函数自动生成JNI包装器,必须将其包含在linphone项目中,而不是belle-sip。
确保已按照doxygen标准在linphone库的头文件中正确记录了该文件。
答案 1 :(得分:0)
我认为我们应该使用新包装作为Linphone开发人员的建议。
构建linphonesdk时会自动生成所有文件,例如Core.java,linphone_jni.cc...。据我了解,生成规则是由.mustache文件定义的。
不再使用linphonecore_jni.cc,LinphoneCore.java之类的旧文件。也许您正在修改这些旧文件。
在较早版本中,新方法会生成到Core.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 */;
}
然后通过以下方式构建linphonesdk:
cmake --build .
然后,将生成Core.java中的所有相关代码linphone_jni.cc。注意注释。没有它们,代码将不会生成。
答案 2 :(得分:0)
由于在新版本的Linphone中不再使用linphonecore_jni.cc文件,因此我将在.aar文件中显示在Call.Java中添加新功能的示例。
打开以下文件:
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项目。右键单击项目->从磁盘重新加载,然后尝试访问该功能。这个程序对我来说非常有效。