Προς το περιεχόμενο

android & eclipse


VagosM

Προτεινόμενες αναρτήσεις

Όντως το είδα κι εγώ. Αν κλείσεις και ανοίξεις πάλι τον Android Virtual Device Manager το βγάζει ως broken.

 

Στην δοκιμή που είχα κάνει δεν έκλεισα και άνοιξα τον manager.

 

 

Κοίτα μπορείς τότε να καταφύγεις στην λύση που σου γράφω στο πρώτο μου post.

 

(Καταρχήν διέγραψε το device και φτιάξε ένα νέο)

 

Ας πούμε οτι το όνομα του νέου είναι MyDevice.

 

Πάρε όλο τον φάκελο MyDevice.avd και μετέφερε τον σε έναν άλλο φάκελο (φτιάξε έναν) στο C: που να έχει μόνο λατινικούς χαρακτήρες.

 

Π.χ.

 

C:\androidDevices

 

Παίρνω το MyDevice.avd kai to πάω στο (cut, paste) C:\androidDevices\MyDevice.avd\

 

Αλλάζω και το MyDevice.ini (το οποίο το αφήνω στην ίδια θέση. Μόνο το *.avd μετακινώ)

από εκεί που έλεγε για παράδειγμα

 

>
target=android-10
path=C:\Users\Κώστας\.android\avd\MyDevice.avd

 

Το μετατρέπω σε

>
target=android-10
path=C:\androidDevices\MyDevice.avd

[Σημ.: Μόνο τη γραμμή path αλλάζω. Τίποτε άλλο]

 

Κάνω save και ξανα ανοίγω τον manager. Λογικά τώρα θα παίξει σωστά.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπόν ασχολήθηκα όσο κατάφερα με τον emulator και η κατάσταση έχει ως εξής:

 

(Τα παρακάτω πολλές φορές είναι η γενική φιλοσοφία του κώδικα όταν όμως χρειάζεται διακλάδωση για το κάθε λειτουργικό αναφέρω μόνο τι γίνεται στα windows οπου υπάρχει το πρόβλημα που προσπάθησα να μελετήσω)

 

Αρχικά το path για το βασικό αρχείο του κάθε emulator (δηλαδή το emulator_name.ini που βρίσκεται μέσα στο avd φάκελο) το παίρνει ως εξής

 

Παίρνει το sdk path ή από enviroment variable ή, αν δεν υπάρχει, παίρνει το path του user profile folder (με SHGetFolderPath με παράμετρο την τιμή CSIDL_PROFILE) και προσθέτει σε αυτό το path το ".android".

 

Στην παραπάνω περίπτωση ακόμα και αν παρεμβάλλονται Ελληνικά στο όνομα του χρήστη, δε δημιουργείται πρόβλημα γιατί το Path προκύπτει από ρουτίνα του win api και φροντίζει εκείνη για τη σωστή μετατροπή.

 

Οπότε το βασικό ini ανοίγει πάντα (προσθέτει φυσικά στο παραπάνω path το "avd\" + avdName + ".ini").

[Σημείωση: για να είναι portable και crossplatform ο κώδικας γίνεται χρήση όσο περισσότερης ANSI C μπορεί να γίνει. Συνεπώς τα αρχεία ανοίγουν μόνο με fopen (που στα windows είναι sigle-byte string αν κατάλαβα καλά) και οι buffers (είτε για file names είτε για τις δομές που αναπαριστούν τα αρχεία ini στη μνήμη) είναι πάντα τύπου char]

 

Το πρόβλημα λοιπόν είναι όπως είπαμε ότι το βασικό αρχείο ini είναι σε utf-8.

 

Το αρχείο αυτό, όπως είναι, ανεβαίνει στη μνήμη και φτιάχνεται μια δομή που το αναπαριστά και περιέχει τα key - value του όπως είναι.

Δηλαδή δε γίνεται καμία μετατροπή.

Όπως είναι η γραμμή μπαίνει σε έναν buffer. (Να πω εδώ πως είδα έναν έξυπνο τρόπο του πως έχουν φτιάξει την όλη δομή για τα ini files και μπορεί να αναφερθώ αργότερα αν δεν κουραστώ)

 

 

Σε πρώτη φάση λοιπόν - το πρώτο βήμα - είναι να ανοίξει το config αρχείο το path του οποίου παίρνεται μέσα από το βασικό ini.

 

Και εδώ είναι το πρόβλημα. Όπως είπε και ο defacer ταΐζεται όπως είναι το (utf-8) string στην fopen με αποτέλεσμα εν τέλη να "κοιτάει" αλλού.

 

Έφτιαξα με λίγο ψάξιμο μια συνάρτηση να μετατρέπει το encoding απλά για να δοκιμάσω

 

>
void
fix_path_encoding(char* buf)
{
#ifdef _WIN32
 size_t size = strlen(buf);
 WCHAR tmpPath[MAX_PATH] = {0};
 MultiByteToWideChar(CP_UTF8, 0, buf, -1, tmpPath, size);
 memset(buf, 0, size);
 WideCharToMultiByte(CP_ACP, 0, tmpPath, -1, buf, size, NULL, NULL);
#else
#endif
}

(Δεν ξέρω αν έχει κάποια λάθη. Πάντως για την ώρα "έπαιξε".)

(π.χ. το strlen παραπάνω δεν είναι αντικειμενικό γιατί αν έχει Ελληνικά ως utf-8 που είναι, τα μετράει ως 2 χαρακτήρες. Αλλά είναι αντικειμενικό στο πόσα byte τελικά καταλαμβάνει το string. Δε ξέρω να στη δεύτερη μετατροπή πρέπει να δίνω άλλο length του widechar αυτή τη φορά.)

 

Υπάρχει μια άλλη συνάρτηση λοιπόν που τις δίνεις απλά το avd name και σου επιστρέφει το path του folder του avd ( σε ένα νέο string ). Οπότε πριν επιστρέψει αυτό το path εφάρμοσα τη συνάρτηση.

 

Το αρχείο config το άνοιξε και προχώρησε παρακάτω!

 

Και παρακάτω όμως με κάποιο άλλο τρόπο αυτή τη φορά πάλι ζητάει το avd content path όχι όμως από την παραπάνω συνάρτηση, πάλι το παίρνει ως utf-8 και δε μπορεί να βρει τα άλλα αρχεία που θέλει.

 

Θα το ψάξω περισσότερο (γιατί μου κάνει εντύπωση να μην καλείται πάλι η ίδια συνάρτηση που επιστρέφει το avd path) όταν βρω χρόνο.

 

Τέλος πάντων με τα grep -r και τα μηνύματα λάθους βρίσκω σιγά-σιγά την άκρη αλλά θέλει χρόνο γιατί η εμπειρία μου όντας λίγη και οι διάφορες υποχρεώσεις μου επιβάλουν κάποια καθυστέρηση.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τέλος πάντων με τα grep -r και τα μηνύματα λάθους βρίσκω σιγά-σιγά την άκρη αλλά θέλει χρόνο γιατί η εμπειρία μου όντας λίγη και οι διάφορες υποχρεώσεις μου επιβάλουν κάποια καθυστέρηση.

 

You rock anyway :)

 

Σχετικά με MBToW και το ανάποδο:

 

To size το δίνεις λάθος, είναι size in characters του tmpPath. Σ' αυτές τις περιπτώσεις πάντα το δίνω είτε 0 (στην οποία περίπτωση μετράει πόσο μεγάλος buffer χρειάζεται, δες MSN) είτε sizeof(tmpPath) / sizeof(tmpPath[0]) ή κάτι ανάλογο σε C++. Η τιμή που δίνεις δεν είναι σωστή αλλά το MAX_PATH είναι αρκετά μεγάλο και σώζει την κατάσταση.

 

Επίσης καταστρέφεις τα περιεχόμενα του buf, κάτι για το οποίο δεν ξέρω αν ο caller έχει αντίρρηση.

 

Στη δεύτερη μετατροπή η παράμετρος είναι size in bytes του buffer εξόδου, πράγμα το οποίο δεν μπορείς να ξέρεις γιατί δεν είσαι owner του buffer αλλά είναι τουλάχιστον size οπότε δεν υπάρχει θέμα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Thanks defacer! :D

 

Ωραία, θα το διορθώσω.

 

Άλλωστε (για τη δεύτερη μετατροπή) από κει που καλώ την fix, ξέρω το μέγεθος του buffer οπότε μπορώ να το περνάω ως όρισμα και εν συνεχεία να το δίνω στην WToMB.

 

Τώρα, για την μετατροπή του ιδού του buffer. Ναι με προβλημάτισε λίγο.

Να fix-αρω επιστρέφοντας καινούριο κάθε φορά string ή να κάνω την μετατροπή στο ίδιο το string.

 

Επειδή γενικά απ όσο μπόρεσα να καταλάβω ακολουθείται μια λογική αξιοποίησης του κάθε buffer όσο πιο πολύ γίνεται

και επειδή η συνάρτηση (που της έκανα fix το buffer πριν τον επιστρέψει) καλείται μόνο σε ένα σημείο (όπου το αποτέλεσμα της το παίρνει μια άλλη μόνο για να ανοίξει το config) επέλεξα για την ώρα να γίνεται fix του ιδού του buffer (και φυσικά μόνο στα windows). Στην πορεία θα δείξει.

 

Anyway.

 

Αν φτάσω κάπου θα επανέλθω!... ^_^

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...