C++ NDK 中的“作业对象”和“jclass”有什么区别

isJ*_*n00 5 c++ java android-ndk ndk-build

我从我遵循的教程中做了 2 种不同的实现,我注意到每个参数都有一点不同,1 个参数是jclass,另一个是jobject我根本不使用这些参数,但我尝试尝试并将它们从jclasstojobjectjobjectto切换jclass我注意到一切仍然按预期工作,所以我不确定究竟是什么jobject以及具体jinstance做什么,如果我的方法没有使用这些参数中的任何一个,为什么需要它们?有人可以在我的 java 类中提供这些方法的正确声明吗?我不确定我是否做对了

JNIEXPORT void JNICALL Java_org_cocos2dx_cpp_AppActivity_pauseSounds(JNIEnv* env, jclass thiz);

JNIEXPORT jstring JNICALL Java_org_cocos2dx_cpp_AppActivity_score(JNIEnv *env, jobject instance);
Run Code Online (Sandbox Code Playgroud)

shi*_*hen 10

一般来说,

  • 如果 JNI 函数参数有jclass,则此 JNI 函数对应于 Java 侧类方法使用静态”声明的本机方法)。 jclass是对当前类的引用。
  • 如果JNI函数的参数有jobject,那么这个JNI函数对应于Java方面的实例方法(本机方法声明没有静态”)。jobject是对当前实例的引用。

具体来说,

JNIEXPORT void JNICALL Java_org_cocos2dx_cpp_AppActivity_pauseSounds(JNIEnv* env, jclass thiz);
Run Code Online (Sandbox Code Playgroud)

对应于您的 Java 端的静态本地方法(类方法),即

JNIEXPORT void JNICALL Java_org_cocos2dx_cpp_AppActivity_pauseSounds(JNIEnv* env, jclass thiz);
Run Code Online (Sandbox Code Playgroud)

虽然低于 JNI 方法

JNIEXPORT jstring JNICALL Java_org_cocos2dx_cpp_AppActivity_score(JNIEnv *env, jobject instance);
Run Code Online (Sandbox Code Playgroud)

对应于您的 Java 端的本地方法(实例方法),即

package org.cocos2dx.cpp

class AppActivity{
    public static native void pauseSounds();
}
Run Code Online (Sandbox Code Playgroud)

如果我的方法没有使用这些参数中的任何一个,为什么需要它们?

这些参数是自动生成的,如果需要,JNI 会使用,例如,在你需要回调 Java 端方法的情况下,你需要像下面这样的东西(()V"是方法 JNI 签名):

jmethodID staticMethod = env->GetStaticMethodID(clazz, "pauseSounds", "()V");
Run Code Online (Sandbox Code Playgroud)

如果你需要回调Java端的实例方法,你需要像下面这样的东西(()Ljava/lang/String;"是方法JNI签名):

env->CallObjectMethod(instance, "score", "()Ljava/lang/String;");
Run Code Online (Sandbox Code Playgroud)