/***
* 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();
}
}
3条答案
按热度按时间abithluo1#
注:我已经完全重新写了这个答案,从零开始,现在我知道它肯定工作;-)。
用洛可可代替jni。
下面是一个简短的示例,我可以快速创建这个示例,其中显示了“拍照者”对话框(基于您对stephen c答案的评论)。
如果你迷路了,试试洛可可式的邮件列表。开发人员很有帮助。
pftdvrlh2#
您仍然需要编写某种类型的jni库来 Package 对现有代码(aka、共享对象、dll、服务程序等)的访问。这是因为jni需要一个相当迟钝(但合理)的命名约定来调用本机函数,因为您需要将数据移入和移出java内存空间,并且需要在java和本机函数之间建立概念性的“桥接”代码。
例如,我编写了一个jni库来提供对iseries上现有c函数的访问。从数据区域读取的函数如下所示:
请注意ibm提供的对底层现有api qwcrdtaa的单行调用;其余的是以java为中心的 Package ,这是进行调用和处理结果所必需的。
另外,要非常小心您所调用的是线程安全的,或者在java层全局地保护代码不受并发调用的影响,或者在o/s层使用mutex保护代码。
注意,非线程安全的本机代码是全局非线程安全的;必须防止与所有其他非线程安全本机代码(而不仅仅是正在调用的一个方法)并发调用。这是因为它可能是不安全的,因为对其他不安全方法调用的某个函数的底层调用(如strerror(),(如果我的c内存运行良好的话))。
z3yyvxxp3#
假设object-c应用程序可以通过命令行运行,一种更简单(问题更少)的方法是使用
java.lang.Runtime.exec(...)
方法。jni充满了复杂性和稳定性问题,如果可以的话最好避免它。
编辑:op解释说这是一个“小部件”而不是命令行应用程序。这使得避免使用jni变得更加困难。但我还是觉得你应该试试。例如,您可以考虑将objective-c小部件 Package 到objective-c应用程序中,该应用程序在新窗口中运行小部件。