1

向新的 linphone SDK 添加自定义功能。

在开发人员的指导下,我通过向 bellesip C 代码添加小功能来构建 liblinphone android sdk。还向 linphonecore_jni.cc 添加了相关条目并构建了 linphone-android-sdk。在文档页面上,它说将为本机功能自动生成包装器。但是在构建 AAR 并将其添加到 linphone 项目之后,我在核心方法中看不到我的方法。我都试过了-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 项目之外,还有其他步骤吗?

4

3 回答 3

0

我正在展示一个在 .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 项目。右键单击项目->从磁盘重新加载,然后尝试访问该功能。这个程序非常适合我。

于 2020-11-26T07:01:39.233 回答
0

为了能够为 C 函数自动生成 JNI 包装器,您必须将其包含在 linphone 项目中,而不是 belle-sip 。

确保它在 linphone 库的头文件中按照 doxygen 标准正确记录。

于 2019-08-28T14:05:01.060 回答
0

我认为我们应该使用新的包装器作为 Linphone 开发人员的推荐。

Core.java、linphone_jni.cc...等所有文件都会在构建linphonesdk时自动生成。据我了解,生成规则由 .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中的所有相关代码。注意注释。没有它们,将不会生成代码。

于 2019-11-29T06:19:35.253 回答