EmbASP-Java
DLVAndroidReasoner.java
1 package it.unical.mat.embasp.specializations.dlv.android;
2 
3 import android.app.IntentService;
4 import android.content.Intent;
5 import android.util.Log;
6 import java.io.File;
7 import java.io.FileOutputStream;
8 import java.util.concurrent.TimeUnit;
9 
10 public class DLVAndroidReasoner extends IntentService {
11 
12 
13  public static final String FILENAME = "tmp_program";
14 
15 
16  //load the static library that contains DLV code compiled for arm processors
17  static{
18  System.loadLibrary("dlvJNI");
19  }
20 
21  public DLVAndroidReasoner() {
22  super("dlv_service");
23  }
24 
25 
26 
27  //Intent messages/actions/extras for ASPService start and BroadcastReceiver communication
28  public static final String ACTION_SOLVE = "it.unical.mat.embasp.specializations.dlv.android.SOLVE";
29  public static final String PROGRAM = "it.unical.mat.embasp.specializations.dlv.android.PROGRAM";
30  public static final String OPTION = "it.unical.mat.embasp.specializations.dlv.android.OPTION";
31  public static final String FILES = "it.unical.mat.embasp.specializations.dlv.android.FILES";
32  public static final String SOLVER_RESULT = "it.unical.mat.embasp.specializations.dlv.android.SOLVER_RESULT";
33  public static final String RESULT_NOTIFICATION = "it.unical.mat.embasp.specializations.dlv.android.RESULT_NOTIFICATION";
34 
35  @Override
36  protected void onHandleIntent(Intent intent) {
37  if (intent != null) {
38  final String action = intent.getAction();
39  if (ACTION_SOLVE.equals(action)) {
40  //get a String with PROGRAM tag that indentify program String
41  //get a String with OPTION tag that indentify options String
42  //call the abstract method that handle a specific solve action
43  //Send the result with a Broadcast Intent
44  final String program = intent.getStringExtra(PROGRAM);
45  final String options = intent.getStringExtra(OPTION);
46  final String files = intent.getStringExtra(FILES);
47  final String result = handleActionSolve(program, options, files);
48  Log.i("result", result);
49  publishResults(result);
50  }
51  }
52  }
53 
54  private void publishResults(String result) {
55  Intent intent = new Intent(RESULT_NOTIFICATION);
56  intent.putExtra(SOLVER_RESULT, result);
57  sendBroadcast(intent);
58  }
59 
60  protected String handleActionSolve(String program, String options, String filesPath) {
61  Log.i("DLV", "Launching DLV");
62  File file = new File(this.getFilesDir(), FILENAME);
63 
64  FileOutputStream outputStream;
65 
66  try {
67  outputStream = new FileOutputStream(file);
68  outputStream.write(program.getBytes());
69  outputStream.close();
70 
71  } catch (Exception e) {
72  e.printStackTrace();
73  }
74 
75  StringBuilder completeProgram = new StringBuilder();
76  completeProgram.append(options).append(" ");
77  completeProgram.append(file.getAbsolutePath()).append(" ");
78 
79  completeProgram.append(filesPath).append(" ");
80 
81  long startTime = System.nanoTime();
82  String result = dlvMain(completeProgram.toString());
83  long stopTime = System.nanoTime();
84  Log.i("DLV", "Execution Time: "+Long.toString(TimeUnit.NANOSECONDS.toMillis(stopTime - startTime)));
85  return result;
86  }
87 
88 
89  private native String dlvMain(String filePath);
90 
91  @Override
92  public void onDestroy() {
93  super.onDestroy();
94  android.os.Process.killProcess(android.os.Process.myPid());//kill the process corresponding to this DLVService
95  }
96 
97 }
it.unical.mat.embasp.specializations.dlv.android.DLVAndroidReasoner
Definition: DLVAndroidReasoner.java:10