这让我抓狂!我正在使用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项目中遇到过这个问题。
答案 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)