【问题标题】:javah jni generated header has syntax error - Android NDK - eclipsejavah jni 生成的标头有语法错误 - Android NDK - eclipse
【发布时间】:2012-07-16 12:17:34
【问题描述】:

Android NDK,我使用以下命令生成jni头,

C:\eclipse_workspace\C_Google_FaceDetect\bin>javah -jni -verbose -classpath C:\Android_SDK\platforms\android-10;C:\eclipse_workspace\C_Google_FaceDetect\src;. -d C:\eclipse_workspace\C_Google_FaceDetect\jni c.google.facedetect.FaceDetect

问题是 即使我设置一切都很好,我收到以下错误

没有找到原生 Lc/google/facedetect/FaceDetect;.decodeYUV([I[BII)V

的实现

threadid=1:线程以未捕获的异常退出(组=0x40018578)

致命异常:主要 java.lang.UnsatisfiedLinkError: decodeYUV

我尝试查找问题所在,发现在 c_google_facedetect_FaceDetect.h jni 头文件中,我实际上有一个语法错误(即使它已生成)

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> /* Header for class c_google_facedetect_FaceDetect */

#ifndef _Included_c_google_facedetect_FaceDetect
#define _Included_c_google_facedetect_FaceDetect
#ifdef __cplusplus extern "C" {
#endif
#undef c_google_facedetect_FaceDetect_CAMERA_WIDTH
#define c_google_facedetect_FaceDetect_CAMERA_WIDTH 480L
#undef c_google_facedetect_FaceDetect_CAMERA_HEIGHT
#define c_google_facedetect_FaceDetect_CAMERA_HEIGHT 320L
/*
* Class:     c_google_facedetect_FaceDetect
* Method:    decodeYUV
* Signature: ([I[BII)V
*/

JNIEXPORT void JNICALL Java_c_google_facedetect_FaceDetect_decodeYUV(JNIEnv *, jobject, jintArray, jbyteArray, jint, jint);

#ifdef __cplusplus }
#endif
#endif

“JNIEXPORT void JNICALL ....”行有语法错误,也许这就是导致所有错误的原因?

我的Android.mk文件如下:

LOCAL_PATH := $(call my-dir)

包括 $(CLEAR_VARS)

LOCAL_MODULE := 人脸检测

LOCAL_SRC_FILES := face-detect.c

包括 $(BUILD_SHARED_LIBRARY)

更新 我唯一的一个 java 文件名为 FaceDetect.java,包含以下代码

public class FaceDetect extends Activity implements SurfaceHolder.Callback, Camera.PreviewCallback
{
static
    {
        Log.d("mytag", "before_lib");
        System.loadLibrary("face-detect");
        Log.d("mytag", "after_lib");
    }
public static native void decodeYUV(int[] out, byte[] fg, int width, int height);
}

此外,Eclipse 并没有说明语法错误是什么,它只是在 JNIExport 行下划线并说明语法错误

另一个更新来回答这个问题 我确实检查过库是否正在加载,这里是 logcat

07-16 13:31:43.257: D/mytag(25188): before_lib
07-16 13:31:43.281: D/dalvikvm(25188): 试图加载 lib /data/data/c.google.facedetect/lib/libface-detect.so 0x40517808
07-16 13:31:43.281: D/dalvikvm(25188): 添加共享库 /data/data/c.google.facedetect/lib/libface-detect.so 0x40517808
07-16 13:31:43.281: D/dalvikvm(25188): 在 /data/data/c.google.facedetect/lib/libface-detect.so 0x40517808 中找不到 JNI_OnLoad,跳过初始化
07-16 13:31:43.281: D/mytag(25188): after_lib

【问题讨论】:

  • Eclipse 没有提供更多细节,它只是在该行显示语法错误
  • Eclipse 经常出错。如果 C 代码没有指向完整的标头集,它就不喜欢 C 代码,而且在最新的 ADT 版本中,很多时候它只是 随机 错误/陈旧的 Java 代码。看看你是否可以禁用检查,或者删除它抱怨的内容,保存并清理,然后将其粘贴回去。
  • @ChrisStratton 谢谢你的评论,所以我应该忽略这个语法错误吗?但是为什么我一直收到“未找到实现错误”
  • 尝试根据 ndk 文档从命令行运行 nkd-build。如果这有效并生成了一个库,则 eclipse 是错误的(尽管在您停止检查之前它可能无法更新您的项目)。但如果 ndk-build 失败,那么你可能真的有答案了。
  • 来自 cygwin bash 的 ndk-build 工作得非常好并生成 .so 文件。有语法错误的java头是由问题中提到的javah命令生成的。

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


【解决方案1】:

没有语法错误。检查您是否正在加载您的本机库并且已成功加载。

【讨论】:

  • 感谢您的回复。用 cmets 写代码有点粗糙,我更新了问题,如果你可以请看一下。谢谢。
  • 我已经检查了该库是否正在加载并更新了问题以包含代码和 logcat :D
  • 实现 JNI_OnLoad 并在其中做一些可观察的事情,以 100% 确保您的库被正确添加。同时转储您的 libface-detect.so 导出的符号并在此处发布。
  • 如何实现 JNI_OnLoad ?请指教
  • Like this。唯一的强制性部分是返回支持的最低 JNI 版本。很可能你想print something into logcat
猜你喜欢
  • 2014-09-12
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
相关资源
最近更新 更多