isJ*_*n00 5 c++ java android-ndk ndk-build
我从我遵循的教程中做了 2 种不同的实现,我注意到每个参数都有一点不同,1 个参数是jclass,另一个是jobject我根本不使用这些参数,但我尝试尝试并将它们从jclasstojobject和jobjectto切换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
一般来说,
jclass,则此 JNI 函数对应于 Java 侧类方法(使用“静态”声明的本机方法)。 jclass是对当前类的引用。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)
| 归档时间: |
|
| 查看次数: |
2143 次 |
| 最近记录: |