一般JNA问题(Discord Game SDK(C)-> Java)[关闭]

问题描述 投票:0回答:1

目标:大家好,我试图在Java中使用Discord的Game SDK。只是几个问题,在此先感谢您的帮助!

问题1:

创建JNA结构时,可以将吸气剂排除在外吗?示例: import com.sun.jna.Callback; import com.sun.jna.Structure; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; /* struct IDiscordCore { void (*destroy)(struct IDiscordCore* core); enum EDiscordResult (*run_callbacks)(struct IDiscordCore* core); void (*set_log_hook)(struct IDiscordCore* core, enum EDiscordLogLevel min_level, void* hook_data, void (*hook)(void* hook_data, enum EDiscordLogLevel level, const char* message)); struct IDiscordApplicationManager* (*get_application_manager)(struct IDiscordCore* core); struct IDiscordUserManager* (*get_user_manager)(struct IDiscordCore* core); struct IDiscordImageManager* (*get_image_manager)(struct IDiscordCore* core); struct IDiscordActivityManager* (*get_activity_manager)(struct IDiscordCore* core); struct IDiscordRelationshipManager* (*get_relationship_manager)(struct IDiscordCore* core); struct IDiscordLobbyManager* (*get_lobby_manager)(struct IDiscordCore* core); struct IDiscordNetworkManager* (*get_network_manager)(struct IDiscordCore* core); struct IDiscordOverlayManager* (*get_overlay_manager)(struct IDiscordCore* core); struct IDiscordStorageManager* (*get_storage_manager)(struct IDiscordCore* core); struct IDiscordStoreManager* (*get_store_manager)(struct IDiscordCore* core); struct IDiscordVoiceManager* (*get_voice_manager)(struct IDiscordCore* core); struct IDiscordAchievementManager* (*get_achievement_manager)(struct IDiscordCore* core); }; */ public class IDiscordCore extends Structure { public interface OnDestroy extends Callback { void accept(IDiscordCore core); } public interface OnCallbacks extends Callback { EDiscordResult accept(IDiscordCore core); } private static final List<String> FIELD_ORDER = Collections.unmodifiableList(Arrays.asList( "destroy", "run_callbacks", "set_log_hook" )); public OnDestroy destroy; public OnCallbacks run_callbacks; public Object set_log_hook; @Override public boolean equals(Object o) { if(this == o) return true; if(!(o instanceof IDiscordCore)) return false; IDiscordCore that = (IDiscordCore) o; return Objects.equals(destroy, that.destroy) && Objects.equals(run_callbacks, that.run_callbacks) && Objects.equals(set_log_hook, that.set_log_hook) ; } @Override public int hashCode() { return Objects.hash(destroy, run_callbacks, set_log_hook); } @Override protected List<String> getFieldOrder() { return FIELD_ORDER; } }

问题2:

创建JNA结构时,我可以加载不打算用作Java对象的字段吗?示例: import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; /* //typedef int64_t DiscordClientId; //typedef void* IDiscordCoreEvents; struct DiscordCreateParams { DiscordClientId client_id; uint64_t flags; IDiscordCoreEvents* events; void* event_data; IDiscordApplicationEvents* application_events; DiscordVersion application_version; struct IDiscordUserEvents* user_events; DiscordVersion user_version; IDiscordImageEvents* image_events; DiscordVersion image_version; struct IDiscordActivityEvents* activity_events; DiscordVersion activity_version; struct IDiscordRelationshipEvents* relationship_events; DiscordVersion relationship_version; struct IDiscordLobbyEvents* lobby_events; DiscordVersion lobby_version; struct IDiscordNetworkEvents* network_events; DiscordVersion network_version; struct IDiscordOverlayEvents* overlay_events; DiscordVersion overlay_version; IDiscordStorageEvents* storage_events; DiscordVersion storage_version; struct IDiscordStoreEvents* store_events; DiscordVersion store_version; struct IDiscordVoiceEvents* voice_events; DiscordVersion voice_version; struct IDiscordAchievementEvents* achievement_events; DiscordVersion achievement_version; }; */ public class DiscordCreateParams extends Structure { public long client_id; public String flags; public Object events; public Object event_data; public Object application_events, application_version, user_events, user_version, image_events, image_version, activity_events, activity_version, relationship_events, relationship_version, lobby_events, lobby_version, network_events, network_version, overlay_events, overlay_version, storage_events, storage_version, store_events, store_version, voice_events, voice_version, achievement_events, achievement_version; private static final List<String> FIELD_ORDER = Collections.unmodifiableList(Arrays.asList("client_id", "flags", "events", "event_data", "application_events", "application_version", "user_events", "user_version", "image_events", "image_version", "activity_events", "activity_version", "relationship_events", "relationship_version", "lobby_events", "lobby_version", "network_events", "network_version", "overlay_events", "overlay_version", "storage_events", "storage_version", "store_events", "store_version", "voice_events", "voice_version", "achievement_events", "achievement_version")); @Override public boolean equals(Object o) { if(this == o) return true; if(!(o instanceof DiscordCreateParams)) return false; DiscordCreateParams that = (DiscordCreateParams) o; return Objects.equals(client_id, that.client_id) && Objects.equals(flags, that.flags) && Objects.equals(events, that.events) && Objects.equals(event_data, that.event_data) && Objects.equals(application_events, that.application_events) && Objects.equals(application_version, that.application_version) && Objects.equals(user_events, that.user_events) && Objects.equals(user_version, that.user_version) && Objects.equals(image_events, that.image_events) && Objects.equals(image_version, that.image_version) && Objects.equals(activity_events, that.activity_events) && Objects.equals(activity_version, that.activity_version) && Objects.equals(relationship_events, that.relationship_events) && Objects.equals(relationship_version, that.relationship_version) && Objects.equals(lobby_events, that.lobby_events) && Objects.equals(lobby_version, that.lobby_version) && Objects.equals(network_events, that.network_events) && Objects.equals(network_version, that.network_version) && Objects.equals(overlay_events, that.overlay_events) && Objects.equals(overlay_version, that.overlay_version) && Objects.equals(storage_events, that.storage_events) && Objects.equals(store_version, that.store_version) && Objects.equals(voice_events, that.voice_events) && Objects.equals(voice_version, that.voice_version) && Objects.equals(achievement_events, that.achievement_events) && Objects.equals(achievement_version, that.achievement_version); } @Override public int hashCode() { return Objects.hash(client_id, flags, events, event_data, application_events, application_version, user_events, user_version, image_events, image_version, activity_events, activity_version, relationship_events, relationship_version, lobby_events, lobby_version, network_events, network_version, overlay_events, overlay_version, storage_events, storage_version, store_events, store_version, voice_events, voice_version, achievement_events, achievement_version); } @Override protected List<String> getFieldOrder() { return FIELD_ORDER; } }
java c discord jna
1个回答
0
投票
您可能希望查看提交给JNA项目的许多用户映射,以获得大致的了解,但可以回答问题:

  • 您不需要吸气剂。实际上,JNA的Structure类要求您将每个元素都声明为公共元素,因此它们是不必要和多余的。有时将它们作为方便的方法包括在内,例如将字符数组转换为字符串等,但通常将其省略。
  • 您必须包括要映射的本机结构的每个元素,或至少等效字节大小。如果它们是内联结构,则必须实际使用映射。在上面的示例中,它们主要是指针(struct *),因此您可以简单地将Pointer对象放在它们的位置以消耗相同的内存量。
© www.soinside.com 2019 - 2024. All rights reserved.