Originariamente inviato da
frid81
sì questo era innocuo. Alla fine non avevo gestito/catturato bene le eccezioni. Ora gli errori si vedono eccome.
Per inviargli come parametri i percorsi dei file di configurazione ho messo tali file dentro res/raw, poi dentro l'applicazione ho creato dei nuovi file (che in automatico android mette in /data/data/"package"/files/, l'unico path che alla fine riconosce) e ci ho copiato il contenuto degli originali, quindi al system.setProperty passo il path suddetto.
Metto un po' di codice nel caso potesse essere di aiuto a qualcuno:
try{createFile(R.raw.option, "option"); ...}catch(Exception e){...}
System.setProperty("osgi.debug", "file:/data/data/NetServ.launch/files/option");
....
private void createFile(int idFile, String nameFile) throws Exception{
StringBuffer inLine = new StringBuffer();
InputStream in =getResources().openRawResource(idFile);
BufferedReader inRd = new BufferedReader(new InputStreamReader(in));
String text;
while ((text = inRd.readLine()) != null) {
inLine.append(text);
inLine.append("\n");
}
in.close();
FileOutputStream create_file = null;
OutputStreamWriter osw = null;
create_file = openFileOutput(nameFile, Context.MODE_WORLD_WRITEABLE);
osw = new OutputStreamWriter(create_file);
osw.write(inLine.toString());
osw.close();
}
Ora il problema si ha con i percorsi dei jar, dato che pure quelli dovrei passargli, altrimenti non fa partire né l'equinox né gli altri bundles che servono; dal momento che nelle apk viene messo tutto nel classes.dex, jar inclusi, secondo me questa via non è perseguibile importando i jar dentro l'applicazione.
Allora ho provato a lasciare i .jar fuori dall'apk e in effetti in questo modo equinox parte, ma non riconosce un Activator di un bundle che serve per l'applicazione:
I/dalvikvm( 5229): Zip is good, but no classes.dex inside, and no valid .odex file in the same directory
E/dalvikvm( 5229): ERROR: defineClass(0x4067f418, NetServ.BuildingBlock.Activator, 0x40686358, 0, 5248, 0x40680970)
I/System.out( 5229): java.lang.UnsupportedOperationException: can't load this type of class file
I/System.out( 5229): at java.lang.VMClassLoader.defineClass(Native Method)
I/System.out( 5229): at java.lang.ClassLoader.defineClass(ClassLoader.java :326)
.............
eppure il .dex c'è....
Allora prova una soluzione 'mista', nel senso:
1) i .jar che ti servono li includi nell'applicazione come library del java builth path, in modo che ti riconosce l'Activator del bundle che ti serve di cui parli.
2) gli stessi .jar, inclusi come library, li mantieni anche esternamente, come se fossero delle copie, in modo da poter far partire equinox.
Per questo puoi copiarli nella dir 'assets' del progetto e copiarli dove vuoi tu ad ogni avvio applicazione, con un semplice i/o stream (o come già hai fatto per la copia da res/raw) che legge 'assets' e copia sul device (solo se mancano, se già ci sono non fai la copia) Es.:
codice:
public void copiaJar() throws IOException {
if (controlloEsistenzaFileJar()) {
}else{
InputStream assetsJar = context.getAssets().open("ilmiofilejar.jar");
OutputStream = new FileOutputStream("/data/data/mia.applicazione.test/ilmiofilejar.jar");
byte[] buffer = new byte[1024];
int length;
while ((length = assetsJar.read(buffer))>0){
outputJar.write(buffer, 0, length);
}
outputJar.flush();
outputJar.close();
assetsJar.close();
}
}
codice:
public boolean controlloEsistenzaFileJar() {
File filejar = new File("\data\data\mia.applicazione.test" + "nomefilejar");
return filejar.exists();
In questo modo dovresti soddisfare l'Activator perchè i jar sono inclusi nel classes.dex, e passare i percorsi dei jar esternamente, perchè li hai anche all'esterno.