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 JNICALLJava_ccme_usernet_love_LovePlayerEngine_init(JNIEnv *env, jobject obj, jint id)

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

于 2013-08-06T02:57:06.013 回答
1

Gabe Sechan 的回答会让您暂时启动并运行,但静态方法的第二个参数是jclass,而不是 jobject。

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