12

javah と android-ndk のヘルプが必要です。

ネイティブ メソッドの H ファイルを生成しようとしましたが、javahでclass file not foundと表示されました。

私のターゲットクラスには絶対名 $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

しかし、常に 1 つの結果しか得られません。

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オプション コマンド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.

何か大切なものを失ったと思うのですが、いまだに解決策が見つかりません。

誰か助けてくれませんか?

4

5 に答える 5

25

Android ビルド システムの ant 部分は、実際にはクラス ファイルをbin/classes. したがって$PROJECT_DIRECTORY/bin/classesjavahクラスパスにある必要があります。たとえば、src ディレクトリから次のコマンドを実行できます。

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

これは、最初に Java コードを対応するクラス ファイルにコンパイルしたことを前提としています。bin/classes ディレクトリの内容を確認することで確認できbtます。パッケージ名の先頭にあるディレクトリが含まれている必要があります。

于 2012-04-03T14:29:50.250 に答える
2

私の場合、問題はWindowsJavaがAndroidJavaの前のパスにあったことでした。したがって、(cygwinで)使用しているjavah(どのjavah)を確認し、パスが正しく表示されない場合は、パスを修正します。

于 2012-10-30T18:11:57.757 に答える
0

私の場合、パッケージの名前を「com.examples.cam」から別の名前に変更する必要がありました。その後、javahは正常に機能しました。同じ「クラスが見つかりません」というエラーが発生する前に。

于 2013-04-23T15:45:27.690 に答える