JAVAH找不到类(android ndk)

时间:2012-04-02 23:45:43

标签: java android android-ndk javah

我需要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 pathes:

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

我尝试按照提及there指定 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 选项命令 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 个答案:

答案 0 :(得分:25)

Android构建系统的ant部分实际上将类文件放在bin/classes中。因此,您需要$PROJECT_DIRECTORY/bin/classes类路径上的javah。例如,您可以从src目录运行:

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

这假设您已首先将Java代码编译为相应的类文件。您可以通过查看bin / classes目录中的内容进行检查 - 它应该包含bt目录,该目录是程序包名称的顶部。

答案 1 :(得分:2)

在我的情况下,问题是Windows Java在Android Java之前的路径中。 所以检查(在cygwin中)你正在使用哪个javah(哪个javah),如果路径看起来不正确,修复路径。

答案 2 :(得分:0)

就我而言,我必须将我的包从'com.examples.cam'重命名为其他内容。然后javah正常工作。在我遇到相同的“未找到课程”错误之前。

答案 3 :(得分:0)

@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>

答案 4 :(得分:0)

即便是我坚持了一段时间,并回答说richq的工作就像一个魅力。 我想补充一点,在classpath中,你应该只提供直到你的包开始的路径(大多数项目是在com之前的一个级别)。对于下一个参数,在包中提供类文件路径(即从com.mypackage.myclass开始) 另外,不要使用'.java'扩展名附加类名。

来自你的包的'src'

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