libgdx / RobovmプロジェクトでMFMailComposeviewControllerを使用してエラーを作成する -- java フィールド と libgdx フィールド と robovm フィールド 関連 問題

Build error with MFMailComposeViewController in a libGDX / RoboVM project












1
vote

問題

日本語

既存のiOS libgdxアプリケーション(Robovmを使用)に機能を追加しようとしているので、scene2d.uiボタンを押すと、MFMailComposeviewControllerのポップアップがアプリケーションに保存されているPOPが添付されている事前定義されたCSVファイルで表示されます。ライブラリー>ローカルフォルダこれは私がこれまでのコードです:

輸入&メンバー:

<事前> <コード> 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(); } } }

私はこのコードを所定の位置に持っていて、私がビルドを試みるまで何らかの問題にフラグを立てていないため、次のエラーが発生します。

<事前> <コード> 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ライブラリを追加しました。これら2つのメソッドを削除すると、プロジェクトはエラーなしで構築されます。これが実行されているように設定する必要がある他のものはありますか?

英語

I'm trying to add functionality to an existing iOS libGDX app (using RoboVM) so that when a scene2d.ui button is pressed, an MFMailComposeViewController popup is displayed with a predefined set of CSV files attached that are stored in the app's Library > local folder. Here's the code I have so far:

Imports & members:

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; 

Methods:

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();         }     } } 

I have this code in place and Eclipse doesn't flag any problems until I attempt a build, whereby I get the following error:

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 

I've added the RoboVM Cocoa Touch Library and the RoboVM Runtime Library to my main project's build path. If I remove these two methods, my project builds without error. Is there something else I need to setup to get this running?

</div
        

回答リスト

1
 
vote
vote
ベストアンサー
 

問題

libgdxアプリケーションでは、サポートされているすべてのプラットフォームのプロジェクトによってメインプロジェクトが共有されています。

SO メインプロジェクトにプラットフォームに依存しないコードが含まれている必要があります。

Robovm Cocoa Touch Library Robovm Runtime Library はプラットフォームに依存し、デスクトップではなく、Android、HTMLなどではなく、iOSでのみ機能します。


溶液

  1. Robovm Cocoa Touch Library Robovm Runtime Library 依存関係を削除します。
  2. それらの依存関係をRobovmプロジェクトに追加します。 (まだ存在していない場合)
  3. メインプロジェクトでを必要とする機能を表すインタフェースを作成します。

    <事前> <コード> public interface EmailHandler { public void createMailWindow(); public void sendEmail(String fileName, String subject, String body); }
  4. 既に書いたコードで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. } }
  5. EmailHandler の EmailHandler パラメータを追加します。プロジェクト)

    <事前> <コード> public class MyAwesomeGame extends Game { private EmailHandler emailHandler; // Use it wherever you like. public MyAwesomeGame(EmailHandler emailHandler) { this.emailHandler = emailHandler; // Rest of constructor. } }
  6. 電源 RobovmLauncher (Robovm Projectのメインクラス)の実装引数

    <事前> <コード> 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); } } 6

  7. 注: 他のプラットフォームのプロジェクトはあなたに叫び始めて<コード> EmailHandler を提供します。これは自然で期待されています。ターゲットにしたい各プラットフォームのインターフェイスのプラットフォーム固有の実装を提供する必要があります。

    これが役立ちます。
    頑張ってください。

 

Problem

In a Libgdx application, the main project is shared by the projects of all supported platforms.

So main project must contain platform independent code.

RoboVM Cocoa Touch Library and RoboVM Runtime Library are platform dependent and would work only on iOS and not on desktop, android, html etc.


Solution

  1. Remove RoboVM Cocoa Touch Library and RoboVM Runtime Library dependencies from main project.
  2. Add those dependencies to the RoboVM project. (If they are not already present.)
  3. Create an interface representing the functionality that you require in the main project.

    public interface EmailHandler {     public void createMailWindow();     public void sendEmail(String fileName, String subject, String body); } 
  4. Create an implementation class in the robovm project with the code you have already written.

    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.     } } 
  5. Add the EmailHandler parameter to the constructor of ApplicationListener (your main game class in main project).

    public class MyAwesomeGame extends Game {      private EmailHandler emailHandler; // Use it wherever you like.      public MyAwesomeGame(EmailHandler emailHandler) {         this.emailHandler = emailHandler;         // Rest of constructor.     } } 
  6. Supply the implementation argument in RobovmLauncher (main class of robovm project).

    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);     } } 

Note:
Projects of other platforms would start shouting at you to provide an EmailHandler to them. This is natural and expected. You should provide platform specific implementation of the interface for each platform you want to target.

Hope this helps.
Good luck.

</div
 
 
   
   

関連する質問

7  libgdxでcocoapodsを使う方法は?  ( How to use cocoapods with libgdx ) 
私はlibgdxでサポートされているすべてのプラットフォームで実行できるlibgdxプロジェクトを持っています。最近、私はGoogle近くのメッセージAPIの統合を始めました。私はそれがプラットフォーム固有のコードを通してAndroidに取り組んできましたが、...

-2  Robovm iOSアプリの検証に失敗しました  ( Robovm ios app verification failed ) 
最新バージョンの libgdx (java) でiOSアプリを作成し、それをApp Storeにアップロードすると、このエラーが表示されます。 XcodeとiOS 7 SDKの正しいバージョンを使用しています。 <事前> <コード> Apple's web s...

0  gdx.net:RobovmとlibgdxコードのNPE  ( Gdx net npe in libgdx code with robovm ) 
Android / iOSアプリに問題があります。ライブラリコード(libgdx?)はNPEをスローしますが、Robovmでのデバッグはサポートされていません。 Androidで実行すると、 handleHttpResponse() メソッドが予想通りに機能...

0  Robovm(iOS用)でGoogle Channels APIを使用することが可能ですか?  ( Possible to use google channels api with robovm for ios ) 
このクライアントを使用してRobovmコードとGooleチャンネルAPIを組み合わせることは可能です。 Java AppEngine Channel Client <事前> <コード> <groupId>org.apache.httpcomponent...

0  rootプロジェクト 'ADMOB'にプロパティ 'Eclipse'が見つかりませんでした  ( Could not find property eclipse on root project admob ) 
My Build.Gradleファイル <事前> <コード> ext { mainClassName = "org.robovm.bindings.admob.sample.Sample" } eclipse.project { name ...

1  libgdx ios - GC機能の不一致  ( Libgdx ios gc capability mismatch ) 
libgdxとクロスプラットフォームゲームに取り組んできましたが、iOSに移植するときは壁に遭遇したようです。 AndroidとDesktopのビルドは大丈夫ですが、Webビルドを試してまだ試していません。私が得るエラーは次のとおりです。 <事前> <コード...

1  iOSデバイスでlibgdxアプリを40%で実行できませんでした  ( Failed to run libgdx app on ios device at 40 ) 
iPhone 7でlibgdxアプリを実行しようとしていますが、40%で継続的に失敗しています <事前> <コード> [ERROR] Couldn't start application org.robovm.libimobiledevice.LibIMob...

7  マグレールは実行中のタスクにハングアップします。[:Android:FeencenceBugSources  ( Gradle hangs on executing tasks androidgeneratedebugsources ) 
私のMac OS XをEl Capitan(およびすべてのツールとSDKで1.5.1から2.xのAndroid Studio)に更新して以来、私はAndroid Studioの私のlibgdx-Robovmゲームに問題があります。私が卒業しているときそれは常に...

5  libgdxを使用してIOS(Robovm)にSQLiteデータベースを使用してください  ( Use sqlite database for ios robovm with libgdx ) 
私は libgdx プロジェクト(Android)を持っています。 sqliteデータベースを使用します。 私は ios バージョン(Robovm)で同じプロジェクトを開発しています.IOSバージョンのSQLiteまたはデータベースについて何も見つかりません。...

0  Ceylon言語をRobovm(iOS)で使用できますか?  ( Can i use the ceylon language with robovm ios ) 
この素晴らしい言語と呼ばれるこの素晴らしい言語のおかげで、JVMに興味を持っています。そのため、RobovmがJavaをターゲットに書くことを可能にすると、RobovmでCeylonを使用する方法がある場合は疑問に思いますか? ありがとう! ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有