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

huy*_*ync 2 java-native-interface android

我在 Activity 中有一个静态 Java 函数。该函数有 int 参数。我想从 JNI 调用这个函数。我使用下面的代码来调用,但我不知道如何传递 int 参数:

在爪哇中:

public static void updateTopScoreLeaderboard(int score) {
    Log.i("", "updateTopScoreLeaderboard " + score);
}
Run Code Online (Sandbox Code Playgroud)

在 JNI 中:

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

如果 Java 函数没有参数,该代码可以很好地工作。但在这种情况下(有 int 参数),它不起作用。

323*_*3go 5

您需要更改方法签名以匹配 int 参数,因此它(I)V代替()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);
Run Code Online (Sandbox Code Playgroud)

  • @huync 要查找签名,请使用“javap”。例如,`javap -s -public com/nch/myApp/MyActivity | egrep -A 2“更新TopScoreLeaderboard”`。就像运行“java”一样,需要首先编译代码,并确保在需要时传入类路径。 (3认同)