2013-11-20 43 views
0

我得到這個「java.lang.UnsatisfiedLinkError中:未發現本機方法:」當我試圖訪問JNI natvie方法「java.lang.UnsatisfiedLinkError:未找到本地方法:」如果刪除頭文件,錯誤可以修復?

11-20 10:52:29.246 E/AndroidRuntime(2742):  at com.example.nativeegl.MyRenderer.nativeGetHelloString(Native Method) 
11-20 10:52:29.246 E/AndroidRuntime(2742):  at com.example.nativeegl.MyRenderer.onDrawFrame(MyRenderer.java:36) 
11-20 10:52:29.246 E/AndroidRuntime(2742):  at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516) 
11-20 10:52:29.246 E/AndroidRuntime(2742):  at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 

後來我發現,如果我刪除.h文件,並只保留.cpp本機文件。錯誤不會發生。

這是我的頭文件

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

#ifndef _Included_com_example_nativeegl_MyRenderer 
#define _Included_com_example_nativeegl_MyRenderer 
extern "C" { 

/* 
    * Class:  com_example_nativeegl_MyRenderer 
    * Method: nativeGetHelloString 
* Signature:()Ljava/lang/String; 
*/ 
JNIEXPORT jstring JNICALL Java_com_example_nativeegl_MyRenderer_nativeGetHelloString 
    (JNIEnv *, jobject); 
} 
#endif 

,這是我的cpp文件

#include "com_example_nativeegl_MyRenderer.h" 
#ifndef _Included_com_example_nativeegl_MyRenderer 
#define _Included_com_example_nativeegl_MyRenderer 
extern "C" { 
/* 
* Class:  com_example_nativeegl_MyRenderer 
* Method: nativeGetHelloString 
* Signature:()Ljava/lang/String; 
*/ 
JNIEXPORT jstring JNICALL Java_com_example_nativeegl_MyRenderer_nativeGetHelloString 
    (JNIEnv *env, jobject obj) { 
     return env->NewStringUTF((char*)" This is calling from JNI suckers!"); 
    } 
} 
#endif 

我Android.mk文件如下:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_CFLAGS := -Wall 
LOCAL_MODULE := myegl_jni 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include 
LOCAL_CPP_EXTENSION := .cpp 
LOCAL_SRC_FILES := com_example_nativeegl_MyRenderer.cpp 

include $(BUILD_SHARED_LIBRARY) 

我發現瞭如果我刪除頭文件並只保留cpp文件,則不會發生錯誤。但我不知道它的原因。

+0

您不允許以下劃線開頭,後跟大寫字母。 – Simple

+0

@簡單 - 顯然你是對的。我不知道什麼機器生成它?也許我們應該告訴誰寫了代碼。 – doctorlove

+0

宏由javah -classpath bin/classes -d jni com.example.nativeegl.myrenderer自動生成。我沒有懷疑他們是錯誤的。他們? – BBai

回答

2

我建議你從CPP文件中刪除

#ifndef _Included_com_example_nativeegl_MyRenderer 
#define _Included_com_example_nativeegl_MyRenderer 

#endif 

。 它們在包含標題時得到定義,因此實際函數的定義不會發生,因此它不會鏈接。 當您刪除標題時,它們沒有被定義,所以定義了該功能。
包括守衛是爲標題:小心你複製和粘貼!

+0

是的!你是對的!!當我包含頭文件時定義宏,並且cpp將不會執行!謝謝!!我花了整個下午試圖找出問題所在......非常感謝。大聲笑 – BBai

相關問題