使用新的Java包装器向linphone添加新的本机功能

时间:2019-08-26 19:02:06

标签: java-native-interface linphone linphone-sdk jniwrapper

向新的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项目之外,还有什么其他步骤。

3 个答案:

答案 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项目。右键单击项目->从磁盘重新加载,然后尝试访问该功能。这个程序对我来说非常有效。