Android 如何从JNI调用带有int参数的Java函数

Android 如何从JNI调用带有int参数的Java函数,android,java-native-interface,Android,Java Native Interface,我在活动中有一个静态Java函数。此函数具有int参数。我想从JNI调用这个函数。我使用以下代码调用,但我不知道如何传递int参数: 在Java中: public static void updateTopScoreLeaderboard(int score) { Log.i("", "updateTopScoreLeaderboard " + score); } 在JNI中: if (JniHelper::getStaticMethodInfo(methodInfo, "com/nc

我在活动中有一个静态Java函数。此函数具有int参数。我想从JNI调用这个函数。我使用以下代码调用,但我不知道如何传递int参数:

在Java中:

public static void updateTopScoreLeaderboard(int score) {
    Log.i("", "updateTopScoreLeaderboard " + score);
}
在JNI中:

if (JniHelper::getStaticMethodInfo(methodInfo, "com/nch/myApp/MyActivity", "updateTopScoreLeaderboard", "()V"))
{
    methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID);
}
methodInfo.env->DeleteLocalRef(methodInfo.classID);

如果Java函数没有参数,则该代码工作良好。但是在这种情况下,如果有int-param,它就不起作用了。

您需要更改方法签名以匹配int参数,因此它是IV而不是V,并且还要将int参数添加到方法调用中:

int myInt = 0;

if (JniHelper::getStaticMethodInfo(methodInfo, "com/nch/myApp/MyActivity", "updateTopScoreLeaderboard", "(I)V"))
{
    methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID, myInt );
}
methodInfo.env->DeleteLocalRef(methodInfo.classID);

您需要更改方法签名以匹配int参数,因此它是IV而不是V,并将int参数添加到方法调用中:

int myInt = 0;

if (JniHelper::getStaticMethodInfo(methodInfo, "com/nch/myApp/MyActivity", "updateTopScoreLeaderboard", "(I)V"))
{
    methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID, myInt );
}
methodInfo.env->DeleteLocalRef(methodInfo.classID);

@huync使用javap查找签名。例如,javap-s-public com/nch/myApp/MyActivity | egrep-A 2 updatetopscore排行榜。正如在运行java时一样,需要首先编译代码,并确保在需要时传入类路径。这是一个很好的答案。您应该调用CallStaticVoidMethod,而不是CallStaticObjectMethod,因为java方法返回的是void,而不是object。@huync使用javap查找签名。例如,javap-s-public com/nch/myApp/MyActivity | egrep-A 2 updatetopscore排行榜。正如在运行java时一样,需要首先编译代码,并确保在需要时传入类路径。这是一个很好的答案。您应该调用CallStaticVoidMethod,而不是CallStaticObjectMethod,因为java方法返回void,而不是对象。