Alexandre Julliard : libwine: Add JNI initialisation support to start Wine from an Android activity.

Alexandre Julliard julliard at winehq.org
Tue Oct 1 14:54:28 CDT 2013


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Oct  1 13:47:40 2013 +0200

libwine: Add JNI initialisation support to start Wine from an Android activity.

---

 libs/wine/loader.c |  103 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 103 insertions(+), 0 deletions(-)

diff --git a/libs/wine/loader.c b/libs/wine/loader.c
index 5891a20..f59942d 100644
--- a/libs/wine/loader.c
+++ b/libs/wine/loader.c
@@ -53,6 +53,10 @@
 extern char **environ;
 #endif
 
+#ifdef __ANDROID__
+#include <jni.h>
+#endif
+
 #define NONAMELESSUNION
 #define NONAMELESSSTRUCT
 #include "windef.h"
@@ -803,6 +807,105 @@ static void apple_main_thread( void (*init_func)(void) )
 #endif
 
 
+#ifdef __ANDROID__
+
+#ifndef WINE_JAVA_CLASS
+#define WINE_JAVA_CLASS "org/winehq/wine/WineActivity"
+#endif
+
+static JavaVM *java_vm;
+static jobject java_object;
+
+/* return the Java VM that was used for JNI initialisation */
+JavaVM *wine_get_java_vm(void)
+{
+    return java_vm;
+}
+
+/* return the Java object that called the wine_init method */
+jobject wine_get_java_object(void)
+{
+    return java_object;
+}
+
+/* main Wine initialisation */
+static jstring wine_init_jni( JNIEnv *env, jobject obj, jobjectArray cmdline, jobjectArray environment )
+{
+    char **argv;
+    char *str;
+    char error[1024];
+    int i, argc, length;
+
+    /* get the command line array */
+
+    argc = (*env)->GetArrayLength( env, cmdline );
+    for (i = length = 0; i < argc; i++)
+    {
+        jobject str_obj = (*env)->GetObjectArrayElement( env, cmdline, i );
+        length += (*env)->GetStringUTFLength( env, str_obj ) + 1;
+    }
+
+    argv = malloc( (argc + 1) * sizeof(*argv) + length );
+    str = (char *)(argv + argc + 1);
+    for (i = 0; i < argc; i++)
+    {
+        jobject str_obj = (*env)->GetObjectArrayElement( env, cmdline, i );
+        length = (*env)->GetStringUTFLength( env, str_obj );
+        (*env)->GetStringUTFRegion( env, str_obj, 0, length, str );
+        argv[i] = str;
+        str[length] = 0;
+        str += length + 1;
+    }
+    argv[argc] = NULL;
+
+    /* set the environment variables */
+
+    if (environment)
+    {
+        int count = (*env)->GetArrayLength( env, environment );
+        for (i = 0; i < count - 1; i += 2)
+        {
+            jobject var_obj = (*env)->GetObjectArrayElement( env, environment, i );
+            jobject val_obj = (*env)->GetObjectArrayElement( env, environment, i + 1 );
+            const char *var = (*env)->GetStringUTFChars( env, var_obj, NULL );
+
+            if (val_obj)
+            {
+                const char *val = (*env)->GetStringUTFChars( env, val_obj, NULL );
+                setenv( var, val, 1 );
+                (*env)->ReleaseStringUTFChars( env, val_obj, val );
+            }
+            else unsetenv( var );
+
+            (*env)->ReleaseStringUTFChars( env, var_obj, var );
+        }
+    }
+
+    java_object = (*env)->NewGlobalRef( env, obj );
+
+    wine_init( argc, argv, error, sizeof(error) );
+    return (*env)->NewStringUTF( env, error );
+}
+
+jint JNI_OnLoad( JavaVM *vm, void *reserved )
+{
+    static const JNINativeMethod method =
+    {
+        "wine_init", "([Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;", wine_init_jni
+    };
+
+    JNIEnv *env;
+    jclass class;
+
+    java_vm = vm;
+    if ((*vm)->AttachCurrentThread( vm, &env, NULL ) != JNI_OK) return JNI_ERR;
+    if (!(class = (*env)->FindClass( env, WINE_JAVA_CLASS ))) return JNI_ERR;
+    (*env)->RegisterNatives( env, class, &method, 1 );
+    return JNI_VERSION_1_6;
+}
+
+#endif  /* __ANDROID__ */
+
 /***********************************************************************
  *           wine_init
  *




More information about the wine-cvs mailing list