在android jni调用中传递了错误的值

时间:2013-08-06 02:43:05

标签: android android-ndk java-native-interface

这让我抓狂!我正在使用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);
}

编译和库链接很好,应用程序正在运行。 但是当我在我的java代码中的某处调用 LovePlayerEngine.init(0); 时,我得到了一些不好的值,例如 1079062016 ,这些值不稳定并且会在不同的运行中发生变化。

我的其他测试,例如传递变量而不是常量或传递String都无法获得意外的值。

任何人都知道问题可能在哪里?这让我很生病,我以前从未在我以前的ndk项目中遇到过这个问题。

2 个答案:

答案 0 :(得分:2)

您在通话中缺少参数。它应该是JNIEXPORT void JNICALL Java_ccme_usernet_love_LovePlayerEngine_init(JNIEnv *env, jobject obj, jint id)

缺少的参数意味着您错误地将对象用作int值。

答案 1 :(得分:1)

Gabe Sechan的回答现在可以帮助你,但静态方法的第二个参数是 jclass ,而不是jobject。

Java_ccme_usernet_love_LovePlayerEngine_init(JNIEnv *env, jclass cls, jint id)