[Monkey] wie Android Funktionen integrieren?

Übersicht Andere Programmiersprachen Beginners-Corner

Neue Antwort erstellen

Midimaster

Betreff: wie Android Funktionen integrieren?

BeitragDi, Sep 11, 2012 10:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Weiß jemand, wie man Java und Monkey kombiniert? Oder wie man Android Funktionenin Monkey benutzen kann?

Mein konkretes Problem ist, dass ich herausfinden möchte, welche Sprache der User auf seinem Smartphone benutzt.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

ChristianK

BeitragDi, Sep 11, 2012 11:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn es nur um die Sprache geht, ist das sogar recht einfach:

Code: [AUSKLAPPEN]
Import mojo

Extern

Function GetAndroidLanguage:String() = "Locale.getDefault().getDisplayName"

Public

Class Language Extends App
   Field languageCode:String
   
   Method OnCreate()
      languageCode = GetAndroidLanguage()
   End
   
   Method OnRender()
      Cls
      DrawText "Sprache: " + languageCode, 10, 10
   End
End

Function Main()
   New Language
End

Im Extern-Abschnitt gibt man die Funktionen an, die man in Monkey verwenden möchte. Der Compiler ersetzt dann einen Aufruf der jeweiligen Funktion durch einen Aufruf der im nachfolgenden String angegebenen Funktion. Für komplexere Sachen, die mehr als einen Funktionsaufruf brauchen, erstellt man einfach eine Java-Datei, z.B. "language.java":

Code: [AUSKLAPPEN]
class Language {
   public static String getAndroidLanguage() {
      return Locale.getDefault().getDisplayName();
   }
}

Um die Funktionen zu benutzen, importiert man die Datei in Monkey und gibt den Namen im Extern-Abschnitt an:

Code: [AUSKLAPPEN]
Import "language.java"

Extern

Function GetAndroidLanguage:String() = "Language.getAndroidLanguage"
...

Statt getDisplayName kannst du natürlich auch eine der anderen Funktionen von hier benutzen: http://developer.android.com/r...ocale.html. Mit getLanguage bekommt man z.B. den zweistelligen ISO-Code der Sprache.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Midimaster

BeitragDi, Sep 11, 2012 12:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Toll! ich bin begeistert. sowas hab ich mich noch nie getraut! Dann brauche ich auch zum ersten mal die Pre-Compiler-Anweisungen:

BlitzMax: [AUSKLAPPEN]
Import mojo

Extern

#If TARGET="android"
Function GetAndroidLanguage:String() = "Locale.getDefault().getDisplayName"
#EndIf

Public



Class Language Extends App
Field languageCode:String

Method OnCreate()
SetUpdateRate 10
languageCode = GetLanguage()
End

Method OnUpdate%()
If KeyHit(KEY_ESCAPE) Then Error ""
End

Method OnRender()
Cls
DrawText "Sprache: " + languageCode, 10, 30
End

Method GetLanguage:String()
#If TARGET="android"
Return GetAndroidLanguage()
#Else
Return "ERROR: 'GetLanguage' not ready on this device"
#EndIf
End
End

Function Main()
New Language
End



Vielen Dank nochmal! Da öffnet sich mir ein weites Feld....
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Midimaster

BeitragDo, Sep 13, 2012 9:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun hab ich gedacht, ich hätte das gestern verstanden mit dem Einbinden von Funktionen, aber nun will der Andriod Systemtimer einfach nicht funktionieren:
BlitzMax: [AUSKLAPPEN]
Extern
#If TARGET="android"
Function GetAndroidMillisecs:Int()="System.currentTimeMillis()"
#EndIf
Public

Class Test Extends App
...
Method OnRender()
Cls
DrawText "Zeit: " + SystemInfo.RealMillisecs(), 10, 60
End
....
End


Class SystemInfo
Function RealMillisecs:Int()
#If TARGET="android"
Return GetAndroidMillisecs()
#Else
Return 0
#EndIf
End
End


Was mache ich falsch?


Bei Diddy kriegen die das irgendwie hin:

Code: [AUSKLAPPEN]
import android.os.Vibrator;
import android.content.Context;
import android.location.LocationManager;
import android.location.LocationListener;
import android.location.Location;
import android.app.AlertDialog;
import android.widget.EditText;
import android.content.DialogInterface;
import android.widget.EditText;

class diddy
{
   public static Vibrator vibrator;
   public static LocationManager myManager;
   public static String latitude = "";
   public static String longitude = "";
   public static boolean gpsStarted = false;
   public static AlertDialog.Builder alert;
   public static EditText input;
   public static String inputString = "";
   
   static int systemMillisecs()
   {
      int ms = (int)System.currentTimeMillis();
      return ms;
   }
.....
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

ChristianK

BeitragDo, Sep 13, 2012 11:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei dem Java-Funktionsnamen im Extern-Bereich musst du die Klammern hinter System.currentTimeMillis weglassen. Diese Deklarationen geben nur den Funktionsnamen im nativen Code an; den Aufruf (also das Hinzufügen der Klammern) macht der Monkey-Compiler selbst.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Midimaster

BeitragDo, Sep 13, 2012 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hatte ich auch schon ausprobiert, führte aber zu:

Zitat:
-compile:
[javac] Compiling 3 source files to C:\Basic\Monkey\LocaleSprache.build\android\bin\classes
[javac] C:\Basic\Monkey\LocaleSprache.build\android\src\com\monkey\MonkeyGame.java:2546: possible loss of precision
[javac] found : long
[javac] required: int
[javac] int t_=System.currentTimeMillis();
[javac] ^
[javac] Note: C:\Basic\Monkey\LocaleSprache.build\android\src\com\monkey\MonkeyGame.java uses unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.
[javac] 1 error

BUILD FAILED
C:\Programme\Android\android-sdk\tools\ant\build.xml:679: The following error occurred while executing this line:
C:\Programme\Android\android-sdk\tools\ant\build.xml:692: Compile failed; see the compiler error output for details.


...und da ist es vorbei mit meinem Latein....

Wie gelingt es Diddy, dass der Timer, der eigentlich LONG zurückgibt. letztendlich als INT an Monkey durchgereicht werden kann? Auch wenn ich den JAVA-Teil in eine eigene Datei ausgliedere und über IMPORT wieder einbinde will es nicht gelingen:

BlitzMax: [AUSKLAPPEN]
class SystemPeter {
Public static Int AndroidMilli() {
Int ms =System.currentTimeMillis();
Return ms;
}
}


BlitzMax: [AUSKLAPPEN]
Import mojo
Import "C:\basic\monkey\ivote\SystemInfo.java"
Extern

#If TARGET="android"
Function GetAndroidMillisecs:Int()="SystemPeter.AndroidMilli"
#EndIf

Public


Class Language Extends App
....


es endet mit der selben Fehlermeldung. Und dabei sieht es doch jetzt schon genauso aus, wie bei Diddy...

[*** EDIT ***]

ich glaub ich hab's!!! Der castet das nach INT!

BlitzMax: [AUSKLAPPEN]
   		Int ms =(Int)System.currentTimeMillis();

dieses (int) scheint sowas wie casten zu sein!!! Juhu!

Nun läuft es, aber ich hab das Problem, das der Timer rückwärts aus dem negativen Bereich kommend Richtung 0 zählt.

Also mach ich es so mit MODULO:

BlitzMax: [AUSKLAPPEN]
class SystemPeter {
static Int AndroidMilli() {
Long longms =System.currentTimeMillis();
longms = longms % 1000000000;
Int ms =(Int)longms;
Return ms;
}
static String AndroidMilliString() {
Long longms =System.currentTimeMillis();
String ms =""+longms;
Return ms;
}
}

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group