JAVAH не может найти класс (android ndk)

Мне нужна помощь в javah и android-ndk.

Я попытался создать H-файл для моего собственного метода, но javah сказал, что файл класса не найден .

Мой целевой класс имеет абсолютное имя $ PROJECT_DIRECTORY / src / bt / nativeclient / BtnativeActivity.java и содержит следующий код:

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"); } } 

Я попытался запустить джаву из следующих паттернов:

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

Я попытался указать -classpath pathes :

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

Я попытался указать android.jar, как упоминалось там :

 $PROJECT_DIRECTORY/bin$ javah -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. Error: No classes were specified on the command line. Try -help. 

Более того, с помощью команды -verbose option javah говорит, что эта команда применяла мой класс к допустимому адресу:

 $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. 

Я думаю, что потерял кое-что важное, но я все еще не могу найти разрешения.

Может ли кто-нибудь помочь мне, пожалуйста?

    Мужественная часть системы сборки Android фактически размещает файлы классов в bin/classes . Поэтому вам нужно иметь $PROJECT_DIRECTORY/bin/classes в пути javah classpath. Например, из каталога src вы можете запустить:

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

    Предполагается, что вы сначала скомпилировали Java-код в соответствующие файлы классов. Вы можете проверить, увидев, что находится в каталоге bin / classes – он должен содержать каталог bt , который является вершиной вашего имени пакета.

    В моем случае проблема заключалась в том, что Windows Java находилась на пути до Android java. Поэтому проверьте (в cygwin), какой javah вы используете (который javah), и если путь не выглядит правильным, исправьте путь.

    В моем случае мне пришлось переименовать свой пакет из «com.examples.cam» в другое. Затем джава работал правильно. Раньше у меня была ошибка «класс не найден».

    @richq абсолютно прав. Но есть еще одна вещь, которую я хотел бы добавить. (И это заняло большую часть моего утреннего решения)

    Указав путь classpath = Refrain от использования. /bin/classes:~/ProjectFolder/bin/classes ( the tilde representing the Home directory)

    Но используйте «../../» для переключения каталогов. По какой-то причине javah не распознает оператор тильды для домашнего каталога.

    Также еще одна вещь, если класс имеет зависимость от другого проекта, тогда вам понадобится это также в пути к классам

     user@laptop:~/SomeProject javah -classpath ./bin/classes:../<Whereever the path is>/SomeOtherDependentProject:../<Path to android-sdk>/android.jar <Qualified class path> 

    Даже я застрял с этим некоторое время и ответил, что richq работал как шарм. Я хотел бы добавить, что в classpath вам нужно предоставить только путь до начала вашего пакета (большинство проектов на одном уровне до ком). Для следующего аргумента укажите путь к файлу класса внутри ваших пакетов (например, начиная с com.mypackage.myclass). Кроме того, не добавляйте имя класса с расширением «.java».

    Из 'src' вашего пакета

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