【问题标题】:Javah Error android.app.Activity not foundJavah 错误 android.app.Activity 未找到
【发布时间】:2012-05-07 14:34:58
【问题描述】:

我正在尝试为一个简单的 NDK 项目创建一个 .h 头文件。使用 cygwin 我浏览到 myprojectDIR\jni 目录,然后执行以下命令:

javah -o com_myproject_MyActivity.h -classpath  myprojectDIR\bin\classes com.myproject.MyActivity

然后出现这个错误信息:

Error: cannot access android.app.Activity
class file for android.app.Activity not found

我在MyActivity 类中有一个本地方法,所以我尝试创建一个名为NativeAccess 的新类(不从android SDK 扩展任何类),它工作正常,创建了.h 文件,ndk - 在成功的设备上构建和测试!

所以我的问题是我需要在我创建的 android 活动和服务中使用本机方法,但我不能这样做,因为 Javah 命令无法从 android-sdk 本身内部访问类。请注意我使用的是 (Windows-7 x64) 并且我有这些环境变量:

ANDROID_NDK : C:\Android\android-ndk-r7b
ANDROID_SDK : C:\Android\android-sdk
ANT_HOME    : C:\ANT\apache-ant-1.8.3
JAVA_HOME   : C:\Program Files\Java\jdk1.7.0_02
PATH        : %JAVA_HOME%\bin;%ANDROID_SDK%\tools;%ANDROID_SDK%\platform-tools;%ANDROID_NDK%;%ANT_HOME%\bin; (other unrelated stuff)

提前致谢

【问题讨论】:

  • 您需要在使用此工具的类路径中包含 android 平台 jar。如果您的任务特别简单,您可以使用 ndk 示例作为指导,手动创建标头。
  • 谢谢克里斯,我确实想过用 javah 工具添加 android jar 的 classpth,但我找不到如何做到这一点..

标签: android android-ndk java-native-interface javah


【解决方案1】:

尝试添加到您的类路径:

-classpath <android-sdk-location>/platforms/android-8.jar

【讨论】:

  • 路径已更改。现在它必须是sdk/platforms/android-10/android.jar
【解决方案2】:

我找到了,事情是这样的:

javah -o com_myproject_MyActivity.h -classpath <android-sdk-location>/platforms/android-8.jar;myprojectDIR\bin\classes com.myproject.MyActivity

【讨论】:

    【解决方案3】:

    在 Eclipse 中尝试以下操作,

    转到 > 运行 |外部工具|外部工具配置 在 Program 下通过单击小图标创建新配置。

    给它命名。

    位置是:C:\Program Files\Java\jdk1.7.0_04\bin\javah.exe

    工作目录将是:${workspace_loc:/My_First_NDK/bin/classes} 和

    参数是:-classpath ${workspace_loc:/My_First_NDK/bin/classes} -bootclasspath "C:\adt-bundle-windows-x86-20140624\sdk\platforms\android-19\android.jar" -v -d ${workspace_loc:/My_First_NDK/jni} com.mypackage.ndk.HelloNDK

    【讨论】:

    【解决方案4】:

    为了生成原生头文件javah需要:

    • 您的课程(通常在build/intermediates/classes 下)
    • Android 类(通常在$ANDROID_HOME/platforms/android-%ver%/android.jar 下)

    所以你只需在-classpath 参数中传递它们

    对我来说主要的挑战基本上是通过它们 - 你必须使用 : 作为分隔符并且路径必须是绝对的。
    Oracle docs

    因此你可能会得到这样的结果:
    javah -classpath &lt;full path to app&gt;build/intermediates/classes/debug:&lt;full path to sdk&gt;/platforms/android-26/android.jar com.myproject.MyActivity

    【讨论】:

      【解决方案5】:

      我找到了,是这样的:

         E:\workspeaceResearch\DAMMADARJNI\src>javah -classpath "E:\Software\sdk\platform
         s\android-19/platforms/android-8.jar"; -jni com.dammadar.jni.Home_Screen
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-27
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多