【问题标题】:Parse.com licensing with decompilation of code for binding the java libraries to C# with XamarinParse.com 使用 Xamarin 将 Java 库绑定到 C# 的代码反编译许可
【发布时间】:2014-08-11 17:27:43
【问题描述】:

原谅我,因为我真的不知道在哪里问这个问题,但我认为知道答案对很多人来说真的很有帮助。如果我不应该在这里问它,请将我重定向到一个更好的网站来问它。谢谢你。

无论如何,我在很多应用程序中都使用 Parse,尤其是在 Android 和基于 Web 的应用程序上作为数据的后端。这是一项很棒的服务,他们提供了很棒的文档,我喜欢它。但是,我最近使用 Xamarin.Android 从 android 上的本机 java 切换到 C#。我很高兴地发现 Parse 有一个用于 Xamarin.Android 应用程序的现有 sdk! 不幸的是,我需要的推送通知功能尚未在该 sdk 中实现,但已在 Parse 的本机 java/android sdk 中进行了详细记录和维护。

因此,在阅读了 Parse 论坛上关于我的问题的所有评论后,我研究了将 Parse 中的 java/android 库绑定到 Xamarin 的 C# for Android,因为它似乎是除了使用之外的唯一解决方案他们的 REST API。 Xamarin 有一个非常好的工具来将 java 绑定到 C#,但是,我可能是错的,我的理解是 Xamarin 绑定工具必须从本机 android parse sdk 反编译 java 源,解析它,然后围绕它创建 C# 包装器。

但是,如果您访问 Parse 的网站并查看他们的许可证,就会发现 Parse 的代码无法反编译。另一方面,当您进入 Xamarin 时,他们有用于 Parse 的 iOS 绑定,它们似乎已将自己绑定到 C#,并且正在 在 Github 上分发。此外,在 Parse 的论坛上,每当有人建议绑定 sdk 时,没有人回应说这是不允许的。

所以我的问题是:

Xamarin 怎么可能在不反编译原生 java 的情况下绑定库?

将 Parse/Android sdk 从 java 绑定到 C# 并在生产应用程序中使用或分发是否合法?

再次感谢!

【问题讨论】:

  • 您的第二个问题似乎假设公开可用的许可证是人们可能获得的唯一一种许可证。大概 xamarin 的人与 parse.com 签订了合同
  • 啊有趣。这样就可以解决问题了。但这仍然无法解释为什么 Parse 在看到人们这样做时不会大发雷霆。
  • 使用 Xamarin 根据合同提供的绑定?同样,这是猜测,但我猜这是因为合同允许。
  • 不,我的意思是有两个不同的人建议在 Parse 的论坛上向公众开放,但 Parse 代表没有任何回应。我猜他们也可以签合同?

标签: java c# android xamarin parse-platform


【解决方案1】:

据我所知,Java 绑定库什么都不反编译。它创建一个绑定项目,该项目基于声明性方法使用 C# 包装器自动包装库。它只包装公共类和方法。

这里是为 YouTubePlayer 生成的包装代码示例

[Register ("com/google/android/youtube/player/YouTubePlayer", "", "Google.Android.Youtube.Player.IYouTubePlayerInvoker")]
public partial interface IYouTubePlayer : IJavaObject {

    bool HasNext {
        // Metadata.xml XPath method reference: path="/api/package[@name='com.google.android.youtube.player']/interface[@name='YouTubePlayer']/method[@name='hasNext' and count(parameter)=0]"
        [Register ("hasNext", "()Z", "GetHasNextHandler:Google.Android.Youtube.Player.IYouTubePlayerInvoker, Google.Android.Youtube.Player")] get;
    }

    bool HasPrevious {
        // Metadata.xml XPath method reference: path="/api/package[@name='com.google.android.youtube.player']/interface[@name='YouTubePlayer']/method[@name='hasPrevious' and count(parameter)=0]"
        [Register ("hasPrevious", "()Z", "GetHasPreviousHandler:Google.Android.Youtube.Player.IYouTubePlayerInvoker, Google.Android.Youtube.Player")] get;
    }

    bool IsPlaying {
        // Metadata.xml XPath method reference: path="/api/package[@name='com.google.android.youtube.player']/interface[@name='YouTubePlayer']/method[@name='isPlaying' and count(parameter)=0]"
        [Register ("isPlaying", "()Z", "GetIsPlayingHandler:Google.Android.Youtube.Player.IYouTubePlayerInvoker, Google.Android.Youtube.Player")] get;
    }

    // Metadata.xml XPath method reference: path="/api/package[@name='com.google.android.youtube.player']/interface[@name='YouTubePlayer']/method[@name='addFullscreenControlFlag' and count(parameter)=1 and parameter[1][@type='int']]"
    [Register ("addFullscreenControlFlag", "(I)V", "GetAddFullscreenControlFlag_IHandler:Google.Android.Youtube.Player.IYouTubePlayerInvoker, Google.Android.Youtube.Player")]
    void AddFullscreenControlFlag (int p0);

    // Metadata.xml XPath method reference: path="/api/package[@name='com.google.android.youtube.player']/interface[@name='YouTubePlayer']/method[@name='cuePlaylist' and count(parameter)=1 and parameter[1][@type='java.lang.String']]"
    [Register ("cuePlaylist", "(Ljava/lang/String;)V", "GetCuePlaylist_Ljava_lang_String_Handler:Google.Android.Youtube.Player.IYouTubePlayerInvoker, Google.Android.Youtube.Player")]
    void CuePlaylist (string p0);

    // Metadata.xml XPath method reference: path="/api/package[@name='com.google.android.youtube.player']/interface[@name='YouTubePlayer']/method[@name='cuePlaylist' and count(parameter)=3 and parameter[1][@type='java.lang.String'] and parameter[2][@type='int'] and parameter[3][@type='int']]"
    [Register ("cuePlaylist", "(Ljava/lang/String;II)V", "GetCuePlaylist_Ljava_lang_String_IIHandler:Google.Android.Youtube.Player.IYouTubePlayerInvoker, Google.Android.Youtube.Player")]
    void CuePlaylist (string p0, int p1, int p2);

    // Metadata.xml XPath method reference: path="/api/package[@name='com.google.android.youtube.player']/interface[@name='YouTubePlayer']/method[@name='cueVideo' and count(parameter)=1 and parameter[1][@type='java.lang.String']]"
    [Register ("cueVideo", "(Ljava/lang/String;)V", "GetCueVideo_Ljava_lang_String_Handler:Google.Android.Youtube.Player.IYouTubePlayerInvoker, Google.Android.Youtube.Player")]
    void CueVideo (string p0);

您可以通过architecture descriptionjava binding description 了解更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多