Alexandre Julliard : wineandroid: Add support for initializing Wine from Java.

Alexandre Julliard julliard at winehq.org
Tue May 30 16:05:13 CDT 2017


Module: wine
Branch: master
Commit: 0519e3c108771a306192ed64757f7b29ca298ce0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0519e3c108771a306192ed64757f7b29ca298ce0

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue May 30 19:12:11 2017 +0200

wineandroid: Add support for initializing Wine from Java.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wineandroid.drv/WineActivity.java | 73 +++++++++++++++++++++++++++++++++-
 1 file changed, 71 insertions(+), 2 deletions(-)

diff --git a/dlls/wineandroid.drv/WineActivity.java b/dlls/wineandroid.drv/WineActivity.java
index 84ce463..b0a8541 100644
--- a/dlls/wineandroid.drv/WineActivity.java
+++ b/dlls/wineandroid.drv/WineActivity.java
@@ -36,10 +36,13 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 
 public class WineActivity extends Activity
 {
+    private native String wine_init( String[] cmdline, String[] env );
+
     private final String LOGTAG = "wine";
     private ProgressDialog progress_dialog;
 
@@ -50,13 +53,68 @@ public class WineActivity extends Activity
 
         requestWindowFeature( android.view.Window.FEATURE_NO_TITLE );
 
-        new Thread( new Runnable() { public void run() { loadWine(); }} ).start();
+        new Thread( new Runnable() { public void run() { loadWine( null ); }} ).start();
     }
 
-    private void loadWine()
+    private void loadWine( String cmdline )
     {
+        File bindir = new File( getFilesDir(), Build.CPU_ABI + "/bin" );
+        File libdir = new File( getFilesDir(), Build.CPU_ABI + "/lib" );
+        File prefix = new File( getFilesDir(), "prefix" );
+        File loader = new File( bindir, "wine" );
+        String locale = Locale.getDefault().getLanguage() + "_" +
+            Locale.getDefault().getCountry() + ".UTF-8";
+
         copyAssetFiles();
         runOnUiThread( new Runnable() { public void run() { progress_dialog.dismiss(); }});
+
+        HashMap<String,String> env = new HashMap<String,String>();
+        env.put( "WINELOADER", loader.toString() );
+        env.put( "WINEPREFIX", prefix.toString() );
+        env.put( "LD_LIBRARY_PATH", libdir.toString() );
+        env.put( "LC_ALL", locale );
+        env.put( "LANG", locale );
+
+        if (cmdline == null)
+        {
+            if (new File( prefix, "drive_c/winestart.cmd" ).exists()) cmdline = "c:\\winestart.cmd";
+            else cmdline = "wineconsole.exe";
+        }
+
+        String winedebug = readFileString( new File( prefix, "winedebug" ));
+        if (winedebug == null) winedebug = readFileString( new File( getFilesDir(), "winedebug" ));
+        if (winedebug != null)
+        {
+            File log = new File( getFilesDir(), "log" );
+            env.put( "WINEDEBUG", winedebug );
+            env.put( "WINEDEBUGLOG", log.toString() );
+            Log.i( LOGTAG, "logging to " + log.toString() );
+            log.delete();
+        }
+
+        System.load( libdir.toString() + "/libwine.so" );
+        prefix.mkdirs();
+
+        runWine( cmdline, env );
+    }
+
+    private final void runWine( String cmdline, HashMap<String,String> environ )
+    {
+        String[] env = new String[environ.size() * 2];
+        int j = 0;
+        for (Map.Entry<String,String> entry : environ.entrySet())
+        {
+            env[j++] = entry.getKey();
+            env[j++] = entry.getValue();
+        }
+
+        String[] cmd = { environ.get( "WINELOADER" ),
+                         "explorer.exe",
+                         "/desktop=shell,,android",
+                         cmdline };
+
+        String err = wine_init( cmd, env );
+        Log.e( LOGTAG, err );
     }
 
     private void createProgressDialog( final int max, final String message )
@@ -126,6 +184,17 @@ public class WineActivity extends Activity
         catch( IOException e ) { return new HashMap<String,String>(); }
     }
 
+    private final String readFileString( File file )
+    {
+        try
+        {
+            FileInputStream in = new FileInputStream( file );
+            BufferedReader reader = new BufferedReader( new InputStreamReader( in, "UTF-8" ));
+            return reader.readLine();
+        }
+        catch( IOException e ) { return null; }
+    }
+
     private final void copyAssetFile( String src )
     {
         File dest = new File( getFilesDir(), src );




More information about the wine-cvs mailing list