]> sigrok.org Git - sigrok-util.git/blob - cross-compile/android/pulseview-java.patch
sigrok-cross-android: Skip building boost threads
[sigrok-util.git] / cross-compile / android / pulseview-java.patch
1 diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml
2 index 0564a8d..0356f33 100644
3 --- a/java/AndroidManifest.xml
4 +++ b/java/AndroidManifest.xml
5 @@ -1,5 +1,5 @@
6  <?xml version='1.0' encoding='utf-8'?>
7 -<manifest package="org.qtproject.example" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
8 -    <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="@string/app_name">
9 +<manifest package="org.sigrok.pulseview" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
10 +    <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="@string/app_name" android:icon="@drawable/logo">
11          <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation"
12                    android:name="org.qtproject.qt5.android.bindings.QtActivity"
13 @@ -9,21 +9,21 @@
14                  <action android:name="android.intent.action.MAIN"/>
15                  <category android:name="android.intent.category.LAUNCHER"/>
16              </intent-filter>
17 -            <meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
18 +            <meta-data android:name="android.app.lib_name" android:value="pulseview"/>
19              <meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
20              <meta-data android:name="android.app.repository" android:value="default"/>
21              <meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
22              <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
23              <!-- Deploy Qt libs as part of package -->
24 -            <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
25 +            <meta-data android:name="android.app.bundle_local_qt_libs" android:value="0"/>
26              <meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
27              <meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
28              <!-- Run with local libs -->
29 -            <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
30 +            <meta-data android:name="android.app.use_local_qt_libs" android:value="0"/>
31              <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
32 -            <meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/>
33 -            <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
34 -            <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
35 +            <meta-data android:name="android.app.load_local_libs" android:value="libs/libgnustl_shared.so"/>
36 +            <meta-data android:name="android.app.load_local_jars" android:value=":"/>
37 +            <meta-data android:name="android.app.static_init_classes" android:value=":"/>
38              <!--  Messages maps -->
39              <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
40              <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
41 diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
42 index bd6928f..68f017e 100644
43 --- a/java/res/values/strings.xml
44 +++ b/java/res/values/strings.xml
45 @@ -1,6 +1,6 @@
46  <?xml version='1.0' encoding='utf-8'?>
47  <resources>
48 -    <string name="app_name"><!-- %%INSERT_APP_NAME%% --></string>
49 +    <string name="app_name">PulseView</string>
50  
51      <string name="ministro_not_found_msg">Can\'t find Ministro service.\nThe application can\'t start.</string>
52      <string name="ministro_needed_msg">This application requires Ministro service. Would you like to install it?</string>
53 diff --git a/java/res/values/libs.xml b/java/res/values/libs.xml
54 --- a/java/res/values/libs.xml  2014-05-17 11:09:29.855631921 +0200
55 +++ b/java/res/values/libs.xml  2014-05-17 11:13:04.380841784 +0200
56 @@ -13,6 +13,9 @@
57  
58       <array name="qt_libs">
59           <!-- %%INSERT_QT_LIBS%% -->
60 +         <item>Qt5Core</item>
61 +         <item>Qt5Gui</item>
62 +         <item>Qt5Widgets</item>
63       </array>
64  
65      <array name="bundled_in_lib">
66 diff --git a/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
67 index 4ebf1f6..f4e3598 100644
68 --- a/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
69 +++ b/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
70 @@ -187,6 +187,14 @@
71      private void loadApplication(Bundle loaderParams)
72      {
73          try {
74 +           org.sigrok.androidutils.Environment.initEnvironment(
75 +               getApplicationInfo().sourceDir);
76 +           System.loadLibrary("gnustl_shared");
77 +            org.sigrok.androidutils.LibWrangler.setupLibs(
78 +                getAssets().open("liblist.txt"),
79 +                new File(getApplicationInfo().nativeLibraryDir),
80 +                new File(getFilesDir(), "lib"));
81 +
82              final int errorCode = loaderParams.getInt(ERROR_CODE_KEY);
83              if (errorCode != 0) {
84                  if (errorCode == INCOMPATIBLE_MINISTRO_VERSION) {
85 diff --git a/java/src/org/sigrok/androidutils/LibWrangler.java b/java/src/org/sigrok/androidutils/LibWrangler.java
86 new file mode 100644
87 index 0000000..0c9effe
88 --- /dev/null
89 +++ b/java/src/org/sigrok/androidutils/LibWrangler.java
90 @@ -0,0 +1,63 @@
91 +package org.sigrok.androidutils;
92 +
93 +import java.io.InputStream;
94 +import java.io.InputStreamReader;
95 +import java.io.BufferedReader;
96 +import java.io.IOException;
97 +import java.io.File;
98 +
99 +public final class LibWrangler
100 +{
101 +    protected static String stripSoVersion(String s)
102 +    {
103 +        int p = s.lastIndexOf(".so.");
104 +        if (p >= 0)
105 +            s = s.substring(0, p+3);
106 +        return s;
107 +    }
108 +
109 +    protected static void makeLink(File from, File to)
110 +        throws IOException
111 +    {
112 +        if (to.equals(from.getCanonicalFile())) {
113 +            // Symlink already correct
114 +            return;
115 +        }
116 +        from.delete();
117 +        int rc;
118 +        Process proc =
119 +            Runtime.getRuntime().exec(new String[]{"ln", "-s",
120 +                                                   to.getAbsolutePath(),
121 +                                                   from.getAbsolutePath()});
122 +        for(;;) {
123 +            try {
124 +                rc = proc.waitFor();
125 +                break;
126 +            } catch(InterruptedException ie) {
127 +            }
128 +        }
129 +        if (rc != 0)
130 +            throw new IOException("Failed to create symlink "+from);
131 +    }
132 +
133 +    public static void setupLibs(BufferedReader reader, File libDir1, File libDir2)
134 +        throws IOException
135 +    {
136 +        if (!libDir2.exists())
137 +            libDir2.mkdir();
138 +
139 +        String libname;
140 +        while ((libname = reader.readLine()) != null) {
141 +            File shlib = new File(libDir2, libname);
142 +            makeLink(shlib, new File(libDir1, stripSoVersion(libname)));
143 +            System.load(shlib.getAbsolutePath());
144 +        }
145 +    }
146 +
147 +    public static void setupLibs(InputStream is, File libDir1, File libDir2)
148 +        throws IOException
149 +    {
150 +       setupLibs(new BufferedReader(new InputStreamReader(is, "US-ASCII")),
151 +                 libDir1, libDir2);
152 +    }
153 +}
154 diff --git a/java/src/org/sigrok/androidutils/Environment.java b/java/src/org/sigrok/androidutils/Environment.java
155 new file mode 100644
156 index 0000000..0c9effe
157 --- /dev/null   2014-04-15 00:13:35.543030287 +0200
158 +++ b/java/src/org/sigrok/androidutils/Environment.java 2014-04-27 00:09:23.073513663 +0200
159 @@ -0,0 +1,21 @@
160 +package org.sigrok.androidutils;
161 +
162 +public final class Environment
163 +{
164 +    static private String[] environment;
165 +
166 +    public static String[] getEnvironment()
167 +    {
168 +       return environment;
169 +    }
170 +
171 +    public static void initEnvironment(String apkFile)
172 +    {
173 +       environment = new String[]
174 +       {
175 +           "PYTHONHOME", ".",
176 +           "PYTHONPATH", apkFile+"/assets/python3.3",
177 +           "SIGROKDECODE_DIR", apkFile+"/assets/libsigrokdecode/decoders",
178 +       };
179 +    }
180 +}