的Android NDK,我用下面的命令来生成JNI头,JAVAH JNI生成的头有语法错误 - 的Android NDK - 日食
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
的问题是 即使我设置好一切,我收到以下错误
No implementation found for native Lc/google/facedetect/FaceDetect;.decodeYUV([I[BII)V
threadid=1:thread exiting with uncaught exception (group=0x40018578)
FATAL EXCEPTION: main 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)
include $(CLEAR_VARS)
LOCAL_MODULE := face-detect
LOCAL_SRC_FILES := face-detect.c
include $(BUILD_SHARED_LIBRARY)
UPDATE 我唯一的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):添加共享lib /data/data/c.google.facedetect/lib/libface-detect.so 0x40517808
07-16 13:31:43.281:D/dalvikvm(25188):在/ data中找不到JNI_OnLoad /data/c.google.facedetect/lib/libface-detect.so 0x40517808,跳过init
07-16 13:31:43.281 :D/mytag(25188):after_lib
什么语法错误? – EJP 2012-07-16 12:25:55
Eclipse没有提供任何更多的细节,它只是说该行的语法错误 – 2012-07-16 13:00:46
Eclipse常常是错误的。它不喜欢C代码,如果它没有指向一整套头文件,并且最新的ADT版本很多时候只是*随机*错误/陈旧的Java代码。看看你是否可以禁用检查,或切断它的抱怨,保存和清理,然后将其粘贴回来。 – 2012-07-16 13:04:29