diff --git a/.gitignore b/.gitignore index 9491a2f..6d91b10 100644 --- a/.gitignore +++ b/.gitignore @@ -360,4 +360,7 @@ MigrationBackup/ .ionide/ # Fody - auto-generated XML schema -FodyWeavers.xsd \ No newline at end of file +FodyWeavers.xsd + +*.DS_Store +**/.idea \ No newline at end of file diff --git a/OpenHarmony.NDK.Bindings/Media_Kit/AVPlayer/OH_AVPlayer.cs b/OpenHarmony.NDK.Bindings/Media_Kit/AVPlayer/OH_AVPlayer.cs new file mode 100644 index 0000000..e318a9b --- /dev/null +++ b/OpenHarmony.NDK.Bindings/Media_Kit/AVPlayer/OH_AVPlayer.cs @@ -0,0 +1,292 @@ +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Marshalling; + +namespace OpenHarmony.NDK.Bindings.Media_Kit.AVPlayer +{ + /// + /// AVPlayer
+ /// + ///
+ public unsafe partial struct OH_AVPlayer + { + + [LibraryImport("libavplayer.so")] + public static partial OH_AVPlayer* OH_AVPlayer_Create(); + + /// + /// 设置播放器的播放源。对应的源可以是http url。 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetURLSource(OH_AVPlayer* player, [MarshalAs(UnmanagedType.LPStr)] string url); + /// + /// 设置播放器的播放媒体文件描述符来源 + /// + /// + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetFDSource(OH_AVPlayer* player, int fd, long offset, long size); + /// + /// 准备播放环境,异步缓存媒体数据 + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_Prepare(OH_AVPlayer* player); + /// + /// 开始播放 + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_Play(OH_AVPlayer* player); + /// + /// 暂停播放 + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_Pause(OH_AVPlayer* player); + /// + /// 停止播放 + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_Stop(OH_AVPlayer* player); + /// + /// 将播放器恢复到初始状态 + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_Reset(OH_AVPlayer* player); + /// + /// 异步释放播放器资源 + /// + /// + /// + + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_Release(OH_AVPlayer* player); + /// + /// 同步释放播放器资源 + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_ReleaseSync(OH_AVPlayer* player); + /// + /// 设置播放器的音量 + /// + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetVolume(OH_AVPlayer* player, float leftVolume, float rightVolume); + /// + /// 改变播放位置 + /// + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_Seek(OH_AVPlayer* player, int mSeconds, AVPlayerSeekMode mode); + /// + /// 获取播放位置,精确到毫秒。 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_GetCurrentTime(OH_AVPlayer* player, int* currentTime); + /// + /// 获取视频高度 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_GetVideoHeight(OH_AVPlayer* player, int* videoHeight); + /// + /// 设置播放器播放速率 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetPlaybackSpeed(OH_AVPlayer* player, AVPlaybackSpeed speed); + /// + /// 设置player音频流类型 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_GetPlaybackSpeed(OH_AVPlayer* player, AVPlaybackSpeed* speed); + /// + /// 设置player音频流类型 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetAudioRendererInfo(OH_AVPlayer* player, OH_AudioStream_Usage streamUsage); + /// + /// 设置player音频流的音效模式 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetAudioEffectMode(OH_AVPlayer* player, OH_AudioStream_AudioEffectMode effectMode); + /// + /// 设置hls播放器使用的码率 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SelectBitRate(OH_AVPlayer* player, int bitRate); + /// + /// 设置播放画面窗口 + /// + /// + /// + /// + + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetVideoSurface(OH_AVPlayer* player, OHNativeWindow* window); + /// + /// 获取媒体文件的总时长,精确到毫秒 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_GetDuration(OH_AVPlayer* player, int* duration); + /// + /// 获取当前播放状态 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_GetState(OH_AVPlayer* player, AVPlayerState* state); + /// + /// 判断播放器是否在播放 + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_Bool OH_AVPlayer_IsPlaying(OH_AVPlayer* player); + /// + /// 判断是用循环播放 + /// + /// + /// + + [LibraryImport("libavplayer.so")] + public static partial OH_Bool OH_AVPlayer_IsLooping(OH_AVPlayer* player); + /// + /// 设置循环播放 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetLooping(OH_AVPlayer* player, OH_Bool loop); + + /// + /// 设置播放器回调方法
+ /// 由于通过此方法设置的信息监听回调函数OH_AVPlayerOnInfo和错误监听回调函数OH_AVPlayerOnError可以传递信息有限,也不便于应用区分多个播放器实例。
+ /// 从 API 12 开始,应使用OH_AVPlayer_SetOnInfoCallback()、OH_AVPlayer_SetOnErrorCallback()接口分别设置信息监听回调函数OH_AVPlayerOnInfoCallback和错误监听回调函数OH_AVPlayerOnErrorCallback。 + ///
+ /// + /// + /// + [Obsolete] + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetPlayerCallback(OH_AVPlayer* player, AVPlayerCallback callback); + /// + /// 选择音频或字幕轨道 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SelectTrack(OH_AVPlayer* player, int index); + /// + /// 取消选择当前音频或字幕轨道 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_DeselectTrack(OH_AVPlayer* player, int index); + /// + /// 获取当前有效的轨道索引 + /// + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_GetCurrentTrack(OH_AVPlayer* player, int trackType, int* index); + /// + /// 设置播放器媒体密钥系统信息回调的方法 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetMediaKeySystemInfoCallback(OH_AVPlayer* player, delegate* unmanaged[Cdecl] callback); + /// + /// 获取媒体密钥系统信息以创建媒体密钥会话 + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_GetMediaKeySystemInfo(OH_AVPlayer* player, DRM_MediaKeySystemInfo* mediaKeySystemInfo); + /// + /// 设置解密信息 + /// + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetDecryptionConfig(OH_AVPlayer* player, MediaKeySession* mediaKeySession, OH_Bool secureVideoPath); + + /// + /// 设置播放器消息回调监听函数 + /// + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetOnInfoCallback(OH_AVPlayer* player, + delegate* unmanaged[Cdecl] callback, + IntPtr userData); + + /// + /// 设置播放器错误回调监听函数 + /// + /// + /// + /// + /// + [LibraryImport("libavplayer.so")] + public static partial OH_AVErrCode OH_AVPlayer_SetOnErrorCallback(OH_AVPlayer* player, + delegate* unmanaged[Cdecl] callback, IntPtr userData); + } +} diff --git a/OpenHarmony.NDK.Bindings/Media_Kit/AVPlayer/player_framework_enums.cs b/OpenHarmony.NDK.Bindings/Media_Kit/AVPlayer/player_framework_enums.cs new file mode 100644 index 0000000..4277f28 --- /dev/null +++ b/OpenHarmony.NDK.Bindings/Media_Kit/AVPlayer/player_framework_enums.cs @@ -0,0 +1,352 @@ +namespace OpenHarmony.NDK.Bindings.Media_Kit.AVPlayer +{ + public enum OH_AVErrCode + { + /// + /// 操作成功 + /// + AV_ERR_OK, + /// + /// 无内存 + /// + AV_ERR_NO_MEMORY, + /// + /// 操作不允许 + /// + AV_ERR_OPERATE_NOT_PERMIT, + /// + /// 无效值 + /// + AV_ERR_INVALID_VAL, + /// + /// IO错误 + /// + AV_ERR_IO, + /// + /// 超时错误 + /// + AV_ERR_TIMEOUT, + /// + /// 未知错误 + /// + AV_ERR_UNKNOWN, + /// + /// 服务死亡 + /// + AV_ERR_SERVICE_DIED, + /// + /// 当前状态不支持此操作 + /// + AV_ERR_INVALID_STATE, + /// + /// 未支持的功能 + /// + AV_ERR_UNSUPPORT, + /// + /// 扩展错误码初始值 + /// + AV_ERR_EXTEND_START, + /// + /// DRM起始错误码。
+ /// 起始版本: 12 + ///
+ AV_ERR_DRM_BASE, + /// + /// DRM解密失败。 + /// 起始版本: 12 + /// + AV_ERR_DRM_DECRYPT_FAILED, + /// + /// 视频起始错误码。
+ /// 起始版本: 12 + ///
+ AV_ERR_VIDEO_BASE, + /// + /// 视频不支持色彩空间转换
+ /// 起始版本: 12 + ///
+ AV_ERR_VIDEO_UNSUPPORTED_COLOR_SPACE_CONVERSION + + } + /// + /// 跳转模式 + /// + public enum AVPlayerSeekMode + { + /// + /// 同步到时间点之后的关键帧 + /// + AV_SEEK_NEXT_SYNC, + /// + /// 同步到时间点之前的关键帧 + /// + AV_SEEK_PREVIOUS_SYNC, + /// + /// 同步到距离指定时间点最近的帧
+ /// 起始版本: 12 + ///
+ AV_SEEK_CLOSEST + } + public enum AVPlaybackSpeed + { + /// + /// 0.75倍速播放 + /// + AV_SPEED_FORWARD_0_75_X, + /// + /// 正常播放 + /// + AV_SPEED_FORWARD_1_00_X, + /// + /// 1.25倍速播放 + /// + AV_SPEED_FORWARD_1_25_X, + /// + /// 1.75倍速播放 + /// + AV_SPEED_FORWARD_1_75_X, + /// + /// 2倍速播放 + /// + AV_SPEED_FORWARD_2_00_X, + /// + /// 0.5倍速播放
+ ///起始版本: 12 + ///
+ AV_SPEED_FORWARD_0_50_X, + /// + /// 1.5倍速播放
+ ///起始版本: 12 + ///
+ AV_SPEED_FORWARD_1_50_X, + /// + /// 3.0倍速播放
+ ///起始版本: 13 + ///
+ AV_SPEED_FORWARD_3_00_X, + /// + /// 0.25倍速播放
+ ///起始版本: 13 + ///
+ AV_SPEED_FORWARD_0_25_X, + /// + /// 0.125倍速播放
+ ///起始版本: 13 + ///
+ AV_SPEED_FORWARD_0_125_X + } + public enum AVPlayerState + { + /// + /// 空闲 + /// + AV_IDLE, + /// + /// 初始化 + /// + AV_INITIALIZED, + /// + /// 准备 + /// + AV_PREPARED, + /// + /// 播放 + /// + AV_PLAYING, + /// + /// 暂停 + /// + AV_PAUSED, + /// + /// 停止 + /// + AV_STOPPED, + /// + /// 结束 + /// + AV_COMPLETED, + /// + /// 释放 + /// + AV_RELEASED, + /// + /// 错误 + /// + AV_ERROR + } + /// + /// 信息类型
+ /// 收到播放器消息时调用 + ///
+ public enum AVPlayerOnInfoType + { + /// + /// 跳转到对应播放位置时返回消息,extra表示seek到的位置 + /// + AV_INFO_TYPE_SEEKDONE, + /// + /// 播放倍速设置完成时返回消息,extra表示播放倍速信息,具体请参考AVPlaybackSpeed + /// + AV_INFO_TYPE_SPEEDDONE, + /// + ///比特率设置完成时返回消息。
+ ///key为OH_PLAYER_BITRATE:取值类型uint32_t。系统通过int32_t传递value,应用需先通过int32_t获取,再强制为uint32_t。 + ///
+ AV_INFO_TYPE_BITRATEDONE, + /// + /// 播放完成时返回消息。 + /// + AV_INFO_TYPE_EOS, + /// + /// 状态改变时返回消息。
+ ///- key为OH_PLAYER_STATE:取值类型int32_t。系统通过int32_t传递value,应用需先通过int32_t获取,再强制转为AVPlayerState。
+ ///- key为OH_PLAYER_STATE_CHANGE_REASON:取值类型int32_t。系统通过int32_t传递value,应用需通过int32_t获取。1:用户操作触发;2:系统变更触发。 + ///
+ AV_INFO_TYPE_STATE_CHANGE, + /// + /// 返回当前播放位置。
+ ///key为OH_PLAYER_CURRENT_POSITION:取值类型int32_t。系统通过int32_t传递value,应用需通过int32_t获取。 + ///
+ AV_INFO_TYPE_POSITION_UPDATE, + /// + /// 视频开始渲染时返回消息。
+ ///key为OH_PLAYER_MESSAGE_TYPE:取值类型int32_t。系统通过int32_t传递value,应用需通过int32_t获取。1表示视频开始渲染。 + ///
+ AV_INFO_TYPE_MESSAGE, + /// + /// 音量改变时返回消息。
+ ///key为OH_PLAYER_VOLUME:取值类型float。系统通过float传递value,应用需通过float获取。取值范围[0.0, 1.0]。 + ///
+ AV_INFO_TYPE_VOLUME_CHANGE, + /// + /// 首次获取视频大小或视频大小更新时返回消息。
+ ///key为OH_PLAYER_VIDEO_WIDTH 或 OH_PLAYER_VIDEO_HEIGHT:取值类型int32_t。系统通过int32_t传递value,应用需通过int32_t获取。 + ///
+ AV_INFO_TYPE_RESOLUTION_CHANGE, + /// + /// 返回多队列缓冲时间。
+ ///- key为OH_PLAYER_BUFFERING_TYPE:取值类型AVPlayerBufferingType。系统通过int32_t传递value,应用需先通过int32_t获取,再强制转为AVPlayerBufferingType。
+ ///- key为OH_PLAYER_BUFFERING_VALUE:取值类型int32_t。系统通过int32_t传递value,应用需通过int32_t获取。当缓冲更新消息类型是AVPLAYER_BUFFERING_PERCENT、AVPLAYER_BUFFERING_CACHED_DURATION时有效,分别表示缓冲进度完成百分比、缓冲数据可播放时长。 + ///
+ AV_INFO_TYPE_BUFFERING_UPDATE, + /// + /// 上报HLS视频比特率列表消息。
+ ///key为OH_PLAYER_BITRATE_ARRAY:取值类型uint8_t字节数组。应用需要先使用uint8_t类型指针变量保存比特率列表,使用size_t类型变量保存字节数组长度。然后分配若干个uint32_t类型的存储空间,接收将uint8_t字节数组转换为uint32_t类型比特率整数值。 + ///
+ AV_INFO_TYPE_BITRATE_COLLECT, + /// + ///音频焦点改变时返回消息。
+ ///取值类型int32_t。系统通过int32_t传递value,应用需通过int32_t获取。
+ ///key为:
+ ///- OH_PLAYER_AUDIO_INTERRUPT_TYPE:取值1表示中断事件开始;2表示结束。
+ ///- OH_PLAYER_AUDIO_INTERRUPT_FORCE:取值0表示强制打断,系统改变音频播放状态;1表示共享打断,应用改变音频播放状态。
+ ///- OH_PLAYER_AUDIO_INTERRUPT_HINT:取值0表示NONE,无提示;1表示RESUME,提示音频恢复;2表示PAUSE,提示音频暂停暂时失去焦点;3表示STOP,提示音频停止;4表示DUCK,音频降低音量;5表示UNDUCK,音频恢复音量。 + ///
+ AV_INFO_TYPE_INTERRUPT_EVENT, + /// + /// 返回播放时长。
+ ///key为OH_PLAYER_DURATION:取值类型int64_t。系统通过int64_t传递value,应用需通过int64_t获取。 + ///
+ AV_INFO_TYPE_DURATION_UPDATE, + /// + /// 播放为直播流时返回消息。
+ ///key为OH_PLAYER_IS_LIVE_STREAM:取值类型int32_t。系统通过int32_t传递value,应用需通过int32_t获取。0表示非直播流,1表示直播流。 + ///
+ AV_INFO_TYPE_IS_LIVE_STREAM, + /// + /// 轨道改变时返回消息,此场景暂未定义 + /// + AV_INFO_TYPE_TRACKCHANGE, + /// + /// 轨道更新时返回消息,此场景暂未定义 + /// + AV_INFO_TYPE_TRACK_INFO_UPDATE, + /// + /// 字幕信息更新时返回消息,此场景暂未定义 + /// + AV_INFO_TYPE_SUBTITLE_UPDATE, + /// + ///音频输出设备改变时返回消息。
+ ///key为OH_PLAYER_AUDIO_DEVICE_CHANGE_REASON:取值类型int32_t。系统通过int32_t传递value,应用需通过int32_t获取。 + ///
+ AV_INFO_TYPE_AUDIO_OUTPUT_DEVICE_CHANGE + } + /// + /// 音频流设置的类型 + /// + public enum OH_AudioStream_Usage + { + /// + /// 未知类型 + /// + AUDIOSTREAM_USAGE_UNKNOWN, + /// + /// 音乐 + /// + AUDIOSTREAM_USAGE_MUSIC, + /// + /// VoIP语音通话 + /// + AUDIOSTREAM_USAGE_VOICE_COMMUNICATION, + /// + /// 语音播报 + /// + AUDIOSTREAM_USAGE_VOICE_ASSISTANT, + /// + /// 闹钟 + /// + AUDIOSTREAM_USAGE_ALARM, + /// + /// 语音消息 + /// + AUDIOSTREAM_USAGE_VOICE_MESSAGE, + /// + /// 铃声 + /// + AUDIOSTREAM_USAGE_RINGTONE, + /// + /// 通知 + /// + AUDIOSTREAM_USAGE_NOTIFICATION, + /// + /// 无障碍 + /// + AUDIOSTREAM_USAGE_ACCESSIBILITY, + /// + /// 电影或视频 + /// + AUDIOSTREAM_USAGE_MOVIE, + /// + /// 游戏 + /// + AUDIOSTREAM_USAGE_GAME, + /// + /// 有声读物(包括听书、相声、评书)、听新闻、播客等 + /// + AUDIOSTREAM_USAGE_AUDIOBOOK, + /// + /// 导航 + /// + AUDIOSTREAM_USAGE_NAVIGATION, + /// + /// VoIP视频通话
+ /// 起始版本: 12 + ///
+ AUDIOSTREAM_USAGE_VIDEO_COMMUNICATION + } + /// + /// 音效模式
+ /// 起始版本: 12 + ///
+ public enum OH_AudioStream_AudioEffectMode + { + /// + /// 无音效模式 + /// + EFFECT_NONE, + /// + /// 默认音效模式 + /// + EFFECT_DEFAULT + } +} diff --git a/OpenHarmony.NDK.Bindings/Media_Kit/AVPlayer/player_framework_structs.cs b/OpenHarmony.NDK.Bindings/Media_Kit/AVPlayer/player_framework_structs.cs new file mode 100644 index 0000000..c161357 --- /dev/null +++ b/OpenHarmony.NDK.Bindings/Media_Kit/AVPlayer/player_framework_structs.cs @@ -0,0 +1,68 @@ +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Marshalling; + +namespace OpenHarmony.NDK.Bindings.Media_Kit.AVPlayer +{ + [StructLayout(LayoutKind.Sequential)] + public struct MediaKeySession + { + + } + [StructLayout(LayoutKind.Sequential)] + public struct OH_AVFormat + { + + } + [StructLayout(LayoutKind.Sequential)] + public struct DRM_MediaKeySystemInfo + { + public int PsshCount { get; set; } + public DRM_PsshInfo PsshInfo { get; set; } + } + /// + /// uuid的PSSH信息
+ /// https://developer.huawei.com/consumer/cn/doc/harmonyos-references/_d_r_m___pssh_info + ///
+ [StructLayout(LayoutKind.Sequential)] + public struct DRM_PsshInfo + { + public uint UuId { get; set; } + public int DataLen { get; set; } + public uint Data { get; set; } + } + [StructLayout(LayoutKind.Sequential)] + public struct OHNativeWindow + { + + } + + [CustomMarshaller(typeof(AVPlayerCallback), MarshalMode.Default, typeof(AVPlayerCallbackMarshaller))] + public static unsafe class AVPlayerCallbackMarshaller + { + public static AVPlayerCallback ConvertToManaged(IntPtr unmanaged) + { + return Marshal.PtrToStructure(unmanaged); + } + + public static IntPtr ConvertToUnmanaged(AVPlayerCallback managed) + { + IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf()); + Marshal.StructureToPtr(managed, ptr, false); + return ptr; + } + } + + [StructLayout(LayoutKind.Sequential)] + public unsafe struct AVPlayerCallback + { + /// + /// Info 委托方法 + /// + public delegate* unmanaged[Cdecl] OH_AVPlayerOnInfo; + + /// + /// Error 委托方法< + /// + public delegate* unmanaged[Cdecl] OH_AVPlayerOnError; + } +} diff --git a/OpenHarmony.NDK.Bindings/OH_Bool.cs b/OpenHarmony.NDK.Bindings/OH_Bool.cs new file mode 100644 index 0000000..47d7f0c --- /dev/null +++ b/OpenHarmony.NDK.Bindings/OH_Bool.cs @@ -0,0 +1,8 @@ +namespace OpenHarmony.NDK.Bindings +{ + public enum OH_Bool + { + False, + True + } +} diff --git a/OpenHarmony.NDK.Bindings/libc/LibcFile.cs b/OpenHarmony.NDK.Bindings/libc/LibcFile.cs new file mode 100644 index 0000000..8e844e4 --- /dev/null +++ b/OpenHarmony.NDK.Bindings/libc/LibcFile.cs @@ -0,0 +1,22 @@ +using System.Runtime.InteropServices; + +namespace OpenHarmony.NDK.Bindings.libc; + +public static partial class LibcFile +{ + /// + /// 打开文件 + /// + /// + /// + /// fd + [LibraryImport("libc",EntryPoint = "open",SetLastError = true)] + public static partial int Open([MarshalAs(UnmanagedType.LPStr)] string path, OpenFlags flags); + + /// + /// 释放文件 + /// + /// + [LibraryImport("libc",EntryPoint = "close",SetLastError = true)] + public static partial void Close(int fd); +} \ No newline at end of file diff --git a/OpenHarmony.NDK.Bindings/libc/LibcFlags.cs b/OpenHarmony.NDK.Bindings/libc/LibcFlags.cs new file mode 100644 index 0000000..d4d4d70 --- /dev/null +++ b/OpenHarmony.NDK.Bindings/libc/LibcFlags.cs @@ -0,0 +1,11 @@ +namespace OpenHarmony.NDK.Bindings.libc; + +[Flags] +public enum OpenFlags +{ + Read = 0x00, + Write = 0x01, + ReadWrite = 0x02, + Creat = 0x40, + Trunc = 0x200 +} \ No newline at end of file