]> sigrok.org Git - sigrok-util.git/blob - cross-compile/android/pulseview-java.patch
sigrok-cross-android: Build Qt5
[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 xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="org.kde.necessitas.example">
8 +<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="org.sigrok.pulseview">
9      <application android:name="org.kde.necessitas.origo.QtApplication" android:icon="@drawable/icon" android:label="@string/app_name">
10          <activity android:name="org.kde.necessitas.origo.QtActivity" android:label="@string/app_name" android:configChanges="orientation|locale|fontScale|keyboard|keyboardHidden" >
11              <intent-filter>
12 @@ -8,7 +8,7 @@
13              </intent-filter>
14              <meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
15              <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
16 -            <meta-data android:name="android.app.lib_name" android:value=""/>
17 +            <meta-data android:name="android.app.lib_name" android:value="pulseview"/>
18              <!--  Messages maps -->
19              <meta-data android:name="android.app.ministro_not_found_msg" android:value="@string/ministro_not_found_msg"/>
20              <meta-data android:name="android.app.ministro_needed_msg" android:value="@string/ministro_needed_msg"/>
21 diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
22 index bd6928f..68f017e 100644
23 --- a/java/res/values/strings.xml
24 +++ b/java/res/values/strings.xml
25 @@ -1,6 +1,6 @@
26  <?xml version='1.0' encoding='utf-8'?>
27  <resources>
28 -    <string name="app_name"></string>
29 +    <string name="app_name">PulseView</string>
30      <string name="ministro_not_found_msg">Can\'t find Ministro service.\nThe application can\'t start.</string>
31      <string name="ministro_needed_msg">This application requires Ministro service. Would you like to install it?</string>
32      <string name="fatal_error_msg">Your application encountered a fatal error and cannot continue.</string>
33 diff --git a/java/src/org/kde/necessitas/origo/QtActivity.java b/java/src/org/kde/necessitas/origo/QtActivity.java
34 index 4ebf1f6..f4e3598 100644
35 --- a/java/src/org/kde/necessitas/origo/QtActivity.java
36 +++ b/java/src/org/kde/necessitas/origo/QtActivity.java
37 @@ -108,6 +108,14 @@ public class QtActivity extends Activity
38      {
39          try
40          {
41 +           org.sigrok.androidutils.Environment.initEnvironment(
42 +               getApplicationInfo().sourceDir);
43 +           System.loadLibrary("gnustl_shared");
44 +            org.sigrok.androidutils.LibWrangler.setupLibs(
45 +                getAssets().open("liblist.txt"),
46 +                new File(getApplicationInfo().nativeLibraryDir),
47 +                new File(getFilesDir(), "lib"));
48 +
49              if (loaderParams.getInt(ERROR_CODE_KEY) != 0)
50              { // fatal error, show the error and quit
51                  AlertDialog errorDialog = new AlertDialog.Builder(QtActivity.this).create();
52 diff --git a/java/src/org/sigrok/androidutils/LibWrangler.java b/java/src/org/sigrok/androidutils/LibWrangler.java
53 new file mode 100644
54 index 0000000..0c9effe
55 --- /dev/null
56 +++ b/java/src/org/sigrok/androidutils/LibWrangler.java
57 @@ -0,0 +1,63 @@
58 +package org.sigrok.androidutils;
59 +
60 +import java.io.InputStream;
61 +import java.io.InputStreamReader;
62 +import java.io.BufferedReader;
63 +import java.io.IOException;
64 +import java.io.File;
65 +
66 +public final class LibWrangler
67 +{
68 +    protected static String stripSoVersion(String s)
69 +    {
70 +        int p = s.lastIndexOf(".so.");
71 +        if (p >= 0)
72 +            s = s.substring(0, p+3);
73 +        return s;
74 +    }
75 +
76 +    protected static void makeLink(File from, File to)
77 +        throws IOException
78 +    {
79 +        if (to.equals(from.getCanonicalFile())) {
80 +            // Symlink already correct
81 +            return;
82 +        }
83 +        from.delete();
84 +        int rc;
85 +        Process proc =
86 +            Runtime.getRuntime().exec(new String[]{"ln", "-s",
87 +                                                   to.getAbsolutePath(),
88 +                                                   from.getAbsolutePath()});
89 +        for(;;) {
90 +            try {
91 +                rc = proc.waitFor();
92 +                break;
93 +            } catch(InterruptedException ie) {
94 +            }
95 +        }
96 +        if (rc != 0)
97 +            throw new IOException("Failed to create symlink "+from);
98 +    }
99 +
100 +    public static void setupLibs(BufferedReader reader, File libDir1, File libDir2)
101 +        throws IOException
102 +    {
103 +        if (!libDir2.exists())
104 +            libDir2.mkdir();
105 +
106 +        String libname;
107 +        while ((libname = reader.readLine()) != null) {
108 +            File shlib = new File(libDir2, libname);
109 +            makeLink(shlib, new File(libDir1, stripSoVersion(libname)));
110 +            System.load(shlib.getAbsolutePath());
111 +        }
112 +    }
113 +
114 +    public static void setupLibs(InputStream is, File libDir1, File libDir2)
115 +        throws IOException
116 +    {
117 +       setupLibs(new BufferedReader(new InputStreamReader(is, "US-ASCII")),
118 +                 libDir1, libDir2);
119 +    }
120 +}
121 diff --git a/java/src/org/sigrok/androidutils/Environment.java b/java/src/org/sigrok/androidutils/Environment.java
122 new file mode 100644
123 index 0000000..0c9effe
124 --- /dev/null   2014-04-15 00:13:35.543030287 +0200
125 +++ b/java/src/org/sigrok/androidutils/Environment.java 2014-04-27 00:09:23.073513663 +0200
126 @@ -0,0 +1,21 @@
127 +package org.sigrok.androidutils;
128 +
129 +public final class Environment
130 +{
131 +    static private String[] environment;
132 +
133 +    public static String[] getEnvironment()
134 +    {
135 +       return environment;
136 +    }
137 +
138 +    public static void initEnvironment(String apkFile)
139 +    {
140 +       environment = new String[]
141 +       {
142 +           "PYTHONHOME", ".",
143 +           "PYTHONPATH", apkFile+"/assets/python3.3",
144 +           "SIGROKDECODE_DIR", apkFile+"/assets/libsigrokdecode/decoders",
145 +       };
146 +    }
147 +}