JAVAH не может найти класс (Android ndk) - PullRequest
12 голосов
/ 03 апреля 2012

Мне нужна помощь в 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");
    } 
 }

Я попытался запустить javah из следующих путей:

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

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

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

Более того, с -бербозой опция команды 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.

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

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

Ответы [ 5 ]

25 голосов
/ 03 апреля 2012

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

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

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

2 голосов
/ 30 октября 2012

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

0 голосов
/ 29 июля 2016

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

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

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

0 голосов
/ 15 апреля 2014

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

При указании classpath = Воздерживаться от использования. /bin/classes:~/ProjectFolder/bin/classes ( the tilde representing the Home directory)

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

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

user@laptop:~/SomeProject javah -classpath ./bin/classes:../<Whereever the path is>/SomeOtherDependentProject:../<Path to android-sdk>/android.jar <Qualified class path>
0 голосов
/ 23 апреля 2013

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

...