0

編集: 以下を変更することで、この問題を解決しました (そして、JNI の苦難の長い行の次の問題を見つけました!)。

Java と C++ の両方でネイティブ メソッドの「静的」宣言を削除し、Java メソッドを追加して、SimpleGame クラスのインスタンスを取得し、呼び出します。

public static void callCppApiResponse (String result, String token, long context) {
**getInstance()**.cppAndroidApiResponse(token, 200, result, result.length(), context);
}

これで、Java から C++ への情報が正常に作成されました。うまくいけば、これは同様の問題を抱えている他の誰かを助けるかもしれません.

元の投稿:

私は Cocos2d-x プラットフォームを使用しており、クロスプラットフォームの iOS/Android アプリ用の C++ コードを書いています。それぞれのネイティブ iOS/Android システムで処理する必要がある特定のメソッドがあるため、できるようにする必要があります。 C++ から Java を呼び出してから、Java から C++ を呼び出します。

アプリの共有ライブラリをロードし、C++ から Java 応答をトリガーすることはできますが、Java から C++ を呼び出そうとすると、次の logcat 出力が表示され、アプリがクラッシュします。

dalvik vm     No implementation found for native Lorg/cocos2dx/simplegame/SimpleGame; cppSideAndroidApiResponse:(Ljava/lang/String;ILJava/lang/String;IJ)V
AndroidRuntime      java.lang.UnsatisfiedLinkError: Native method not found: org.cocos2dx.simplegame.SimpleGame.cppAndroidApiResponse:(Ljava/lang/String;ILJava/lang/String;IJ)V

関連するJavaコードは次のとおりです。

package org.cocos2dx.simplegame;

private static native void cppAndroidApiResponse(String token, int response, String data, int dataLen, long context);

static {
    System.loadLibrary("sb");
}

public static void callCppApiResponse (String result, String token, long context) {
//This is where the error is triggered
    cppAndroidApiResponse(token, 200, result, result.length(), context);
}

および C++ ファイル cppSide.h で:

# if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif
# if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
JNIEXPORT static void JNICALL 
Java_org_cocos2dx_simplegame_SimpleGame_cppAndroidApiResponse(JNIEnv *, jobject, jstring, jint, jstring, jint, jlong);
#endif
#ifdef __cplusplus
}
#endif

最後に cppSide.cpp ファイル

#include "cppSide.h"

extern "C" {
JNIEXPORT static void JNICALL      
Java_org_cocos2dx_simplegame_SimpleGame_cppAndroidApiResponse(JNIEnv *env, jobject obj, jstring token, jint response, jstring data, jint length, jlong context)
{ ...do stuff...}
}

C++ ベースの読み込み画面が表示されるため、共有ライブラリが読み込まれていることがわかります。また、別のメソッドで同じ cppSide.cpp ファイルから Java を呼び出すことができるため、JNI が少なくとも部分的に機能していることもわかります。JNI と Cocos2d-X のドキュメントを調べましたが、役に立ちませんでした。

前もって感謝します!

4

0 に答える 0