首页 > 其他分享 >linphone-linphonecore_jni.h文件分析

linphone-linphonecore_jni.h文件分析

时间:2023-06-02 20:04:50浏览次数:48  
标签:core java LinphoneAddressImpl org linphonecore linphone jni


说明

linphone主要的功能逻辑基本都是C/C++语言实现的,这时候在Android端就必须要用到JNI了,这里并不是要分析JNI怎样使用的逻辑,这里有几篇文章是java部分JNI的官方说明。

这份说明并没有怎样说怎么样配置Android的JNI环境,只是说了语法部分
java-jni-01-Introduction
java-jni-02-Design-Overview
java-jni-03-JNI Types and Data Structure
java-jni-04-JNI Functions
java-jni-05-The Invocation API

如果想知道怎样配置Android端的JNI环境(NDK环境),可以购买下面这部书籍, 非常棒,当工具书非常好。网络上有英文版的,但是里面的内容不全。

生成代码

分析到这里,我并不清楚使用什么生成的custom_rules.xml 文件,不过我很清楚,这肯定是那个脚本文件打包生成的, 也许是Ant,也许是Python。这里并不影响分析,所以清楚这些就好。下面的XML文件清楚的说明了,生成linphonecore_jni.h所需要的源文件,我们可以从这些源文件下手了。

<target name="javah" depends="-set-debug-mode,-compile">
        <echo level="info">Generate JNI header</echo>
        <javah outputfile="gen/linphonecore_jni.h">
            <classpath>
                <pathelement location="${out.classes.absolute.dir}" />
            </classpath>
            <class name="org.linphone.core.LinphoneAddressImpl" />
            <class name="org.linphone.core.LinphoneAuthInfoImpl" />
            <class name="org.linphone.core.LinphoneCallImpl" />
            <class name="org.linphone.core.LinphoneCallLogImpl" />
            <class name="org.linphone.core.LinphoneCallParamsImpl" />
            <class name="org.linphone.core.LinphoneCallStatsImpl" />
            <class name="org.linphone.core.LinphoneChatMessageImpl" />
            <class name="org.linphone.core.LinphoneChatRoomImpl" />
            <class name="org.linphone.core.LinphoneCoreFactoryImpl" />
            <class name="org.linphone.core.LinphoneCoreImpl" />
            <class name="org.linphone.core.LinphoneFriendImpl" />
            <class name="org.linphone.core.LinphoneProxyConfigImpl" />
            <class name="org.linphone.core.PayloadTypeImpl" />
            <class name="org.linphone.core.LpConfigImpl" />
            <class name="org.linphone.core.LinphoneInfoMessageImpl" />
            <class name="org.linphone.core.LinphoneEventImpl" />
            <class name="org.linphone.core.PresenceActivityImpl" />
            <class name="org.linphone.core.PresenceModelImpl" />
            <class name="org.linphone.core.PresenceNoteImpl" />
            <class name="org.linphone.core.PresencePersonImpl" />
            <class name="org.linphone.core.PresenceServiceImpl" />
            <class name="org.linphone.core.ErrorInfoImpl" />
            <class name="org.linphone.core.TunnelConfigImpl" />
        </javah>
        <javah outputfile="gen/xml2lpc_jni.h">
            <classpath>
                <pathelement location="${out.classes.absolute.dir}" />
            </classpath>
            <class name="org.linphone.tools.Xml2Lpc" />
        </javah>
        <javah outputfile="gen/lpc2xml_jni.h">
            <classpath>
                <pathelement location="${out.classes.absolute.dir}" />
            </classpath>
            <class name="org.linphone.tools.Lpc2Xml" />
        </javah>
    </target>

可以参考下面的文件链接

linphone-LinphoneAddress.java文件分析
linphone-LinphoneAuthInfo.java
linphone-PayloadType.java文件分析

linphonecore_jni.h

这个文件比较大,我就不把它的代码全部贴出来了,反正大致形式也就这样,java层的代码参考上面的。

部分代码节选。

* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_linphone_core_LinphoneAddressImpl */

#ifndef _Included_org_linphone_core_LinphoneAddressImpl
#define _Included_org_linphone_core_LinphoneAddressImpl
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_linphone_core_LinphoneAddressImpl
 * Method:    newLinphoneAddressImpl
 * Signature: (Ljava/lang/String;Ljava/lang/String;)J
 */
JNIEXPORT jlong JNICALL Java_org_linphone_core_LinphoneAddressImpl_newLinphoneAddressImpl
  (JNIEnv *, jobject, jstring, jstring);

/*
 * Class:     org_linphone_core_LinphoneAddressImpl
 * Method:    ref
 * Signature: (J)J
 */
JNIEXPORT jlong JNICALL Java_org_linphone_core_LinphoneAddressImpl_ref
  (JNIEnv *, jobject, jlong);

/*
 * Class:     org_linphone_core_LinphoneAddressImpl
 * Method:    unref
 * Signature: (J)V
 */
JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneAddressImpl_unref
  (JNIEnv *, jobject, jlong);

/*
 * Class:     org_linphone_core_LinphoneAddressImpl
 * Method:    clone
 * Signature: (J)J
 */
JNIEXPORT jlong JNICALL Java_org_linphone_core_LinphoneAddressImpl_clone
  (JNIEnv *, jobject, jlong);

/*
 * Class:     org_linphone_core_LinphoneAddressImpl
 * Method:    getDisplayName
 * Signature: (J)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneAddressImpl_getDisplayName
  (JNIEnv *, jobject, jlong);

××××××

最后的思考

最后想了一想, 其实linphonecore_jni.h无非就是javah命令生成的对应的头文件而已。并没有什么难度, 要说难度的还是里面具体的实现逻辑。所以我决定,按上面每个文件对应的函数进行逻辑性的分析,分析的深度为:到c代码的存取部分。


标签:core,java,LinphoneAddressImpl,org,linphonecore,linphone,jni
From: https://blog.51cto.com/u_11797608/6404735

相关文章

  • linphone-LinphoneProxyConfigImpl文件对应的JNI层文件分析
    说明native函数privatenativelongnewLinphoneCore(LinphoneCoreListenerlistener,StringuserConfig,StringfactoryConfig,Objectuserdata); privatenativevoiditerate(longnativePtr); privatenativeLinphoneProxyConfiggetDefaultProxyConfig(longnativePtr);......
  • 2023安卓逆向 -- JNI学习(从开发到反编译)
    一、新建nativeC++项目,填写好项目信息,一路下一步即可二、创建好项目,直接点击运行,出现下面界面,说明我们的环境都没有问题三、Java层调用java层函数1、新建一个JavaClass,命名为JavaFun2、编写java函数packagecom.example.jnitest;publicclassJavaFun{publicstaticStr......
  • linphone-sdk-android网络检测分析
    原文 linphone-sdk-android网络检测分析-掘金(juejin.cn)前言好久没写linphone-sdk-android相关的文章了,上一篇文章还是一个月之前,经过上次修改linphone-sdk-android后最近没有啥问题发生,本文记录下之前遇到的linphone网络问题的坑。注:笔者的App作为Launcher......
  • linphone-LinphoneManager.java文件分析
    介绍本篇主要是对个人对LinphoneManger类的理解及对上面的注释,这是对linphone研究的一个开始.会慢慢对linphone逐步分析,随着时间的推进,我会对linphone有进一步的了解,希望希望了解的同学能跟上我的脚步.简介LinphoneManager类是Linphone的主要操作管理类.主要功能:官方/***......
  • linphone-去掉HistoryListFragment界面
    说明HistoryListFragment界面包括:1.拨打电话记录2.未接听记录3.修改记录看图HistoryListFragment主界面修改拨打记录界面好,开始去掉这个界面需要分析的点每次拨打记录是怎样形成的。记录还可以分日期显示一组。没有接到的电话是怎样记录的就该记录时,那个工具栏是怎样变......
  • linphone-自动接听视频电话
    说明由于一定场合,需要需要自动接听视频。这时候linphone在Settings->VIDEO中勾选EnableVideo选项就可以实现自动接听视频选项了。在SettingsFragment.java中findPreference(getString(R.string.pref_video_enable_key)).setOnPreferenceChangeListener(newOnPreferenceChangeList......
  • Linphone Use WIFI only
    说明因为在移动网络下,如果输入错误的网址,会发生崩溃的情况,所以极大的可能使用了WIFI,就是在每次通话的时候都要检查是否网络可达.UseWIFIonly在每次检查的时候,去检查配置文件.这个是在.linphonerc配置文件中能够//NetworksettingspublicvoidsetWifiOnlyEnabled(B......
  • linphone 手机上不能接听电话
    问题描述这几天遇到一个问题,linphone安装到手机上不能接听电话.解决办法在linphone的设置中,设置端口号为5060,不要使用随机的端口号.然后问题就解决了.具体位置......
  • Linphone callState 电话状态的监听状态(二)
    LinphonecallState电话状态的监听状态callState是一个观察者模式接着上一篇的说,这篇主要是涉及到linphone中c层的注册监听机制.主要是代码追踪和代码过程.linphonecore_jni.cc中的添加监听事件的方法linphonecore_jni.cc中extern"C"voidJava_org_linphone_core_LinphoneC......
  • Linphone callState 电话状态的监听状态(一)
    0.阅读指南因为粘贴的代码比较多,阅读之前请先看目录.如果对这篇文章有什么建议的话,请在评论中指出.尽量把文章写好点.1.说明LinphoneService有个重要的机制,就是通过注册LinphoneCoreListener的实例,当Linphone的状态发声变化的时候,会回调相应的方法.然后linphone上层......