2012-04-02 29 views
12

Ho bisogno di un aiuto in javah e Android-NDK.javah non riesce a trovare la classe (NDK Android)

Ho provato a generare H-programma per il mio metodo nativo, ma javah detto file di classe non trovata.

La mia classe di destinazione ha assoluto nome $ PROJECT_DIRECTORY/src/BT/nativeclient/BtnativeActivity.java e contiene il codice seguo:

package bt.nativeclient; 

import android.app.Activity; import android.os.Bundle; import android.widget.TextView; 

public class BtnativeActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     TextView tv = new TextView(this); 
     tv.setText(stringFromJNI()); 
     setContentView(tv); 
    } 

    public native String stringFromJNI(); 

    static 
    { 
     System.loadLibrary("hello-jni"); 
    } 
} 

Ho provato a iniziare javah dal seguente: sentieri

$(PROJECT_DIRECTORY)/bin$ javah -jni bt.nativeclient.BtnativeActivity 
$(PROJECT_DIRECTORY)/jni$ javah -jni bt.nativeclient.BtnativeActivity 
$(PROJECT_DIRECTORY)$ javah -jni bt.nativeclient.BtnativeActivity 

ho provato a specificare -classpath sentieri:

$PROJECT_DIRECTORY/src$ javah -classpath :. bt.nativeclient.BtnativeActivity 

Ho provato a specificare android.jar come accennato there:

$PROJECT_DIRECTORY/bin$ javah -classpath :/home/l/android-sdks/platforms/android-10/android.jar:. bt.nativeclient.BtnativeActivity 

Ma sempre ottengo un solo risultato:

error: cannot access bt.nativeclient.BtnativeActivity 
class file for bt.nativeclient.BtnativeActivity not found 
javadoc: error - Class bt.nativeclient.BtnativeActivity not found. 
Error: No classes were specified on the command line. Try -help. 

Inoltre, con -verbose comando opzione javah dice che questo comando stava richiedendo alla mia classe il posto valido:

$PROJECT_DIRECTORY/src$ javah **-verbose** -classpath :/home/l/android-sdks/platforms/android-10/android.jar:. bt.nativeclient.BtnativeActivity 
error: cannot access bt.nativeclient.BtnativeActivity 
class file for bt.nativeclient.BtnativeActivity not found 
javadoc: error - Class bt.nativeclient.BtnativeActivity not found. 
[ Search Path: /usr/lib/jvm/java-6-openjdk/jre/lib/resources.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/jsse.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/jce.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/charsets.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/netx.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/plugin.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/modules/jdk.boot.jar:/usr/lib/jvm/java-6-openjdk/jre/classes/:/home/l/android-sdks/platforms/android-10/android.jar:. ] 
Error: No classes were specified on the command line. Try -help. 

Penso di aver perso qualche cosa importante, ma non riesco ancora a trovare una soluzione.

Qualcuno mi potrebbe aiutare, per favore?

+0

fa comandi javac opere? – Lucifer

risposta

25

La parte formica del sistema di build di Android in realtà pone i file di classe in bin/classes. Quindi è necessario avere $PROJECT_DIRECTORY/bin/classes nel classpath javah. Ad esempio, dalla directory src è possibile eseguire:

$PROJECT_DIRECTORY/src$ javah -classpath ../bin/classes bt.nativeclient.BtnativeActivity 

Questo presuppone che avete compilato il codice Java per i file di classe corrispondenti prima. È possibile controllare visualizzando ciò che si trova nella directory bin/classes - deve contenere la directory bt, che è la parte superiore del nome del pacchetto.

+2

Grazie mille! Funziona –

+0

Non ci posso credere, ha funzionato anche per me: D –

+0

Per me funziona bene, grazie mille per risparmiare tempo –

2

Nel mio caso il problema era che il Java di Windows era nel percorso prima del Java di Android. Quindi controlla (in cygwin) quale javah stai usando (quale javah), e se il percorso non sembra corretto, correggi il percorso.

0

nel mio caso ho dovuto rinominare il mio pacchetto da "com.examples.cam" a qualcos'altro. Allora javah ha funzionato correttamente. Prima ho avuto lo stesso errore di "classe non trovata".

0

@richq è assolutamente giusto. Ma c'è ancora una cosa che vorrei aggiungere. (E che ha ripreso gran parte della mia mattinata risolvendola)

Mentre si specifica il percorso di classe = Astenersi dall'utilizzare. /bin/classes:~/ProjectFolder/bin/classes (the tilde representing the Home directory)

Ma utilizzare "../../" per passare alle directory.Per qualche ragione, javah non riconosce l'operatore tilde per la home directory.

anche un'altra cosa se la classe ha una dipendenza da altro progetto allora si avrebbe bisogno che pure nel classpath

[email protected]:~/SomeProject javah -classpath ./bin/classes:../<Whereever the path is>/SomeOtherDependentProject:../<Path to android-sdk>/android.jar <Qualified class path> 
0

Anche Sono rimasto bloccato con questo per un po 'e rispondere a quella richq funzionato come un fascino. Vorrei aggiungere che in classpath si dovrebbe fornire solo il percorso fino all'inizio del pacchetto (la maggior parte dei progetti è un livello prima di com). Per il prossimo argomento fornire il percorso del file di classe all'interno dei pacchetti (ad esempio a partire da com.mypackage.myclass) Inoltre, non aggiungere il nome classe con estensione ".java".

da 'src' del vostro pacchetto

javah -classpath ../package1/package2/.. com.mypackage.myclassname

Problemi correlati