【问题标题】:Add new native function to linphone with new java wrapper使用新的 java 包装器向 linphone 添加新的本机函数
【发布时间】:2019-08-26 19:02:06
【问题描述】:

为新的 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 项目之外,还有其他步骤吗?

【问题讨论】:

  • 你解决了吗?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为我们应该使用新包装器作为 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中的所有相关代码。注意注释。没有它们,代码将不会生成。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-21
        相关资源
        最近更新 更多