JNIがnativeメソッドを呼び出すとjavaが現れる.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()異常の解決方法

2268 ワード

昨日JNIのAndroidエンジニアリングDemoを入手し、demoを開発のメインラインエンジニアリングに統合したところ、JNIメソッドを呼び出すと同じ異常が続いていたことがわかりました
java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()
JNIのsoライブラリに問題があると思っていましたが、demoが正常に動作していて、原因を見つけることができませんでした.私は自分の質問を確認することができて、今日の午前中に別のCを書いた同僚に聞いて、彼に私の状況を説明しました.そして彼は私に包名が一致しない原因ではないかと聞いて、私ははっと悟った.確かに私がメインラインに移植した工事で、JNIを呼び出す予定のパッケージ名を変更しました.soライブラリはコンパイル時に呼び出されたパケット名を指定し、demoが正常に動作している理由を説明します.androidエンジニアリング呼び出しJNIのパケット名がsoライブラリ定義のパケット名クラス名メソッド名と一致することを保証するだけでよい.
JNIのことを簡単に紹介します.hファイルの内容
 
#ifndef _Included_packagename_classname   //packagename    android       classname   android     JNI  ,      JNI   

#define _Included_packagename_classname

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     packagename_classname

 * Method:    methodName

 */

JNIEXPORT jint JNICALL Java_packagename_classname_methodname();  // jint          int,JNICALL        JNI        、   ...

JNIのcファイルフォーマットは以下の通りである
 
 
#include "packagename_classname.h"  //        .h     ,   .h       

#include <stdio.h>



#include "../../../src/classname.h"  //   src      .h  



#include <android/log.h>

static char *tag = "logtag_jni"; //     log   



#define LOGI(...) __android_log_print(ANDROID_LOG_INFO   , tag, __VA_ARGS__)

#define LOGW(...) __android_log_print(ANDROID_LOG_WARN   , tag, __VA_ARGS__)

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , tag, __VA_ARGS__)

#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, tag, __VA_ARGS__)

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG  , tag, __VA_ARGS__)



/*

 * Class:     packagename_classname

 * Method:    methodName

 */

JNIEXPORT jint JNICALL Java_packagename_classname_methodName(){...}



......

}


これらを理解すれば、JNIの理解を助けることができます.