기존 iOS libGDX 앱 (RoboVM 사용)에 기능을 추가하여 scene2d.ui 버튼을 누르면 앱의 라이브러리> 로컬에 저장된 미리 정의 된 CSV 파일 세트가 첨부 된 MFMailComposeViewController 팝업이 표시되도록하려고합니다. 폴더. 지금까지 내가 가지고있는 코드는 다음과 같습니다.
수입 및 회원 :
import org.robovm.apple.foundation.*;
import org.robovm.apple.messageui.MFMailComposeResult;
import org.robovm.apple.messageui.MFMailComposeViewController;
import org.robovm.apple.messageui.MFMailComposeViewControllerDelegate;
import org.robovm.apple.uikit.*;
import org.robovm.objc.ObjCObject;
private UIWindow mailWindow;
private UIViewController mailViewController;
private MFMailComposeViewController mailPicker;
행동 양식:
private void createMailWindow()
{
mailWindow = new UIWindow(UIScreen.getMainScreen().getBounds());
mailViewController = new UIViewController();
mailWindow.setRootViewController(mailViewController);
}
private void sendEmail(String fileName, String subject, String body)
{
mailPicker = new MFMailComposeViewController();
mailPicker.addStrongRef(mailWindow);
String path = NSBundle.getMainBundle().getResourcePath();
if (fileName != null)
{
path = path.substring(0, path.lastIndexOf('/')) + "/Library/local/" + fileName;
}
MFMailComposeViewControllerDelegate delegate = new MFMailComposeViewControllerDelegate()
{
public void mailComposeControllerDidFinish(MFMailComposeViewController controller, MFMailComposeResult result, NSError error)
{
controller.dismissViewController(true, null);
mailPicker.removeFromParentViewController();
mailPicker.removeStrongRef(mailWindow);
mailWindow.setHidden(true);
mailPicker = null;
}
@Override
public void didFinish(MFMailComposeViewController controller, MFMailComposeResult result, NSError error)
{
}
};
mailPicker.setMailComposeDelegate(delegate);
mailPicker.addStrongRef((ObjCObject) delegate);
if (fileName != null)
{
// attach CSVs here...
}
mailPicker.setSubject((subject != null ? subject : "Test Results"));
mailPicker.setMessageBody((body != null ? body : "Please find attached the latest results data."), false);
if (MFMailComposeViewController.canSendMail())
{
mailWindow.getRootViewController().presentViewController(mailPicker, true, null);
mailWindow.makeKeyAndVisible();
}
}
}
이 코드가 제자리에 있고 Eclipse는 빌드를 시도 할 때까지 문제를 표시하지 않으므로 다음 오류가 발생합니다.
Exception in thread "main" java.lang.NoClassDefFoundError: org/robovm/rt/bro/NativeObject
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at com.mmu.cfa.DesktopMain.main(DesktopMain.java:26)
Caused by: java.lang.ClassNotFoundException: org.robovm.rt.bro.NativeObject
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 49 more
RoboVM Cocoa Touch Library와 RoboVM Runtime Library를 메인 프로젝트의 빌드 경로에 추가했습니다. 이 두 가지 방법을 제거하면 프로젝트가 오류없이 빌드됩니다. 이것을 실행하기 위해 설정해야 할 다른 것이 있습니까?
Libgdx 응용 프로그램에서 기본 프로젝트는 지원되는 모든 플랫폼의 프로젝트에서 공유 됩니다.
따라서 메인 프로젝트는 플랫폼 독립적 인 코드를 포함해야합니다 .
RoboVM Cocoa Touch Library 및 RoboVM Runtime Library 는 플랫폼에 따라 다르며 iOS에서만 작동하며 데스크톱, Android, html 등에서는 작동하지 않습니다.
기본 프로젝트에서 필요한 기능을 나타내는 인터페이스를 만듭니다 .
public interface EmailHandler {
public void createMailWindow();
public void sendEmail(String fileName, String subject, String body);
}
이미 작성한 코드를 사용하여 robovm 프로젝트에 구현 클래스를 만듭니다 .
public class RobovmEmailHandler implements EmailHandler {
@Override
public void createMailWindow() {
// Your code goes here.
}
@Override
public void sendEmail(String fileName, String subject, String body) {
// Your code goes here.
}
}
( 메인 프로젝트 의 메인 게임 클래스) EmailHandler
생성자 에 매개 변수를 추가합니다 .ApplicationListener
public class MyAwesomeGame extends Game {
private EmailHandler emailHandler; // Use it wherever you like.
public MyAwesomeGame(EmailHandler emailHandler) {
this.emailHandler = emailHandler;
// Rest of constructor.
}
}
공급 구현 인수 에 RobovmLauncher
(robovm 프로젝트의 주요 클래스).
public class RobovmLauncher extends IOSApplication.Delegate {
@Override
protected IOSApplication createApplication() {
EmailHandler emailHandler = new RobovmEmailHandler();
IOSApplicationConfiguration config = new IOSApplicationConfiguration();
return new IOSApplication(new MyAwesomeGame(emailHandler), config);
}
}
참고 :
다른 플랫폼의 프로젝트는을 (를) 제공하라는 소리를 지르기 시작 EmailHandler
합니다. 이것은 자연스럽고 예상됩니다. 타겟팅하려는 각 플랫폼에 대해 플랫폼 별 인터페이스 구현을 제공해야합니다.
도움이 되었기를 바랍니다.
행운을 빕니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다