这是我的功能:
Long Java_my_package_MainActivity_getDistance(JNIEnv* env, jobject obj, Long a_id1,Long a_id2)
{
char temp[128];
sprintf(temp,"ID1: %u , ID2: %u",a_id1, a_id2);
__android_log_print(ANDROID_LOG_INFO, "From NDK : ", temp);
return(0);//just to test ...
}
Long是一种类型def:
typedef long long Long;
因为我有一些比int type
的最大值更大的值在我的java类中:
static {
System.loadLibrary("module");
}
// declare the native code function - must match ndkfoo.c
private native int getDistance(long id1, long id2);
我用这一行调用本机函数:
getDistance(1234,2456);
logcat中的输出是:
ID1: 1234, ID2: 0
我总是得到ID2 = 0 !!,我不知道为什么第二个参数总是评估为0!
答案 0 :(得分:4)
或尝试:
#include <jni.h>
#include <android/log.h>
#define TAG "Java_my_package_MainActivity"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
// ...
JNIEXPORT void JNICALL Java_my_package_MainActivity_getDistance(JNIEnv *env, jobject obj, jlong a_id1, jlong a_id2){
// ...
LOGI("ID1: %lu , ID2: %lu", a_id1, a_id2);
}
答案 1 :(得分:2)
您的sprintf
需要使用%llu
来打印64位数量而不是%u
。我相信你实际上是通过JNI获得了正确的值,但是sprintf
调用被告知期望两个32位值并且正在打印第一个参数的高位字。
此外,您可能应该在JNI声明中使用jlong
而不是您自己的自定义类型(它在jni.h
中定义)。