1

これは私を夢中にさせています!私は ndk でライブラリを作成しています。リンクは問題ありませんでしたが、メソッドを呼び出すときに、対応する c 関数に渡される引数の値が正しくないことがわかりました。

私のJavaクラスは次のとおりです

package ccme.usernet.love;
class LovePlayerEngine {
    static {
        System.loadLibrary("loveplayer");
    }
    public static native void init(int id);
}

私のCファイルは次のとおりです。

#include <jni.h>
#include <android/log.h>

#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "TEST", __VA_ARGS__))

JNIEXPORT void JNICALL Java_ccme_usernet_love_LovePlayerEngine_init(JNIEnv *env, jint id)
{
    LOGI("INIT with id %d\n", id);
}

コンパイルとライブラリのリンクは問題なく、アプリは実行されていました。しかし、LovePlayerEngine.init(0);を呼び出したとき。私の Java コードのどこかで、1079062016のような安定しておらず、別の実行で変化するいくつかの悪い値を取得します。

定数の代わりに変数を渡す、文字列を渡すなどの他のテストはすべて、予期しない値を取得できませんでした。

問題がどこにあるのか、誰にも手がかりがありますか? これは私にはうんざりです。以前のndkプロジェクトでこれに遭遇したことはありません。

4

2 に答える 2

2

呼び出しにパラメーターがありません。JNIEXPORT void JNICALL である必要がありますJava_ccme_usernet_love_LovePlayerEngine_init(JNIEnv *env, jobject obj, jint id)

パラメーターが欠落しているということは、オブジェクトを誤って int 値として使用していることを意味します。

于 2013-08-06T02:57:06.013 に答える
1

Gabe Sechan's answer は、今のところ起動して実行できますが、静的メソッドの 2 番目のパラメーターはjclassであり、jobject ではありません。

Java_ccme_usernet_love_LovePlayerEngine_init(JNIEnv *env, jclass cls, jint id)
于 2013-08-06T14:55:29.033 に答える