用JNI包装现有的应用程序 [英] Wrapping an existing application with JNI

查看:61
本文介绍了用JNI包装现有的应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大多数详细介绍如何开始使用JNI的文档都描述了如何使用X-Code构建新的JNI应用程序.任何人都可以将我链接到描述如何在现有应用程序中使用JNI与Objective-C交互的描述.

解决方案

注意:我已经完全从头开始重新编写了此答案,现在我确定它可以正常工作;-). /p>

使用 Rococoa 代替JNI.

这是我能够拨出的简短示例,显示了拍照"对话框(基于您对Stephen C的回答的评论).

/***
 * INCOMPLETE: Doesn't have imports or anything like that.
 ***/

public interface Quartz extends Library
{
  public static Quartz instance = (Quartz)Native.loadLibrary("Quartz", Quartz.class);
}

public interface IKPictureTaker extends NSObject
{
  public static final _Class CLASS = Rococoa.createClass("IKPictureTaker", _Class.class);

  public interface _Class extends NSClass
  {
    /**
     * Returns a shared {@code IKPictureTaker} instance, creating it if necessary.
     * @return an {@code IKPictureTaker} object.
     */
    IKPictureTaker pictureTaker();
  }

  NSInteger runModal();
}

public class IKPictureTakerTest extends JFrame
{
  public static void main(String[] args) throws Exception
  {
    // You need a GUI before this will work.
    new IKPictureTakerTest().setVisible(true);

    NSAutoreleasePool pool = NSAutoreleasePool.new_();

    // Initialize the Quartz framework.
    Quartz.instance.toString();

    // Display the dialog.
    IKPictureTaker pictureTaker = IKPictureTaker.CLASS.pictureTaker();
    NSInteger result = pictureTaker.runModal();

    if (result.intValue() == 0) // NSCancelButton
    {
      System.out.println("User cancelled.");
    }
    else
    {
      assert result.intValue() == 1; // NSOKButton
      System.out.println("User chose an image.");
    }

    System.out.println(pictureTaker.inputImage()); // null if the user cancelled

    pool.release();
  }
}

如果迷路了,请尝试洛可可邮件列表.开发人员非常有帮助.

Most of the documentation that details how to get started with JNI described how to build a new JNI application using X-Code. Can anyone link me to a description of how to use JNI to interface with Objective-C in an existing application.

解决方案

NOTE: I have completely re-written this answer from scratch, now that I know for sure it works ;-).

Use Rococoa instead of JNI.

Here is a brief sample I was able to whip up that displays the picture taker dialog (based on your comment to Stephen C's answer).

/***
 * INCOMPLETE: Doesn't have imports or anything like that.
 ***/

public interface Quartz extends Library
{
  public static Quartz instance = (Quartz)Native.loadLibrary("Quartz", Quartz.class);
}

public interface IKPictureTaker extends NSObject
{
  public static final _Class CLASS = Rococoa.createClass("IKPictureTaker", _Class.class);

  public interface _Class extends NSClass
  {
    /**
     * Returns a shared {@code IKPictureTaker} instance, creating it if necessary.
     * @return an {@code IKPictureTaker} object.
     */
    IKPictureTaker pictureTaker();
  }

  NSInteger runModal();
}

public class IKPictureTakerTest extends JFrame
{
  public static void main(String[] args) throws Exception
  {
    // You need a GUI before this will work.
    new IKPictureTakerTest().setVisible(true);

    NSAutoreleasePool pool = NSAutoreleasePool.new_();

    // Initialize the Quartz framework.
    Quartz.instance.toString();

    // Display the dialog.
    IKPictureTaker pictureTaker = IKPictureTaker.CLASS.pictureTaker();
    NSInteger result = pictureTaker.runModal();

    if (result.intValue() == 0) // NSCancelButton
    {
      System.out.println("User cancelled.");
    }
    else
    {
      assert result.intValue() == 1; // NSOKButton
      System.out.println("User chose an image.");
    }

    System.out.println(pictureTaker.inputImage()); // null if the user cancelled

    pool.release();
  }
}

If you get lost, try the Rococoa mailing lists. The developers are very helpful.

这篇关于用JNI包装现有的应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆