JAVAH can';t查找类(android ndk)

JAVAH can';t查找类(android ndk),java,android,android-ndk,javah,Java,Android,Android Ndk,Javah,我需要javah和androidndk的帮助 我试图为我的本机方法生成H-file,但javah表示未找到类文件 我的目标类的绝对名称为$PROJECT_DIRECTORY/src/bt/nativeclient/BtnativeActivity.java,包含以下代码: package bt.nativeclient; import android.app.Activity; import android.os.Bundle; import android.widget.TextView;

我需要javah和androidndk的帮助

我试图为我的本机方法生成H-file,但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,如前所述:

但我总是只能得到一个结果:

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.
我想我失去了一些重要的东西,但我仍然找不到解决办法


有人能帮我吗?

Android构建系统的ant部分实际上将类文件放在
bin/classes
中。因此,您需要在
javah
classpath上有
$PROJECT\u目录/bin/classes
。例如,您可以从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'重命名为其他名称。然后javah工作正常。之前我也有同样的“找不到类”错误。

@richq绝对正确。但我想补充一点。(这占用了我上午大部分时间来解决这个问题)

指定类路径时=避免使用。
/bin/classes:~/ProjectFolder/bin/classes(表示主目录的波浪号)

但是使用“./../”来切换目录。出于某种原因,javah无法识别主目录的tilde操作符

还有一件事,如果类依赖于其他项目,那么在类路径中也需要它

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

就连我也被这个问题困扰了一段时间,并回答说richq的工作很有魅力。 我想补充一点,在classpath中,您应该只提供包开始之前的路径(大多数项目在com之前只有一个级别)。对于下一个参数,请给出包内的类文件路径(即从com.mypackage.myclass开始) 另外,不要在类名后面附加“.java”扩展名

从包的“src”开始

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

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