В чем разница между "jobject" и "jclass" в C ++ NDK - PullRequest
3 голосов
/ 21 мая 2019

Я сделал 2 разных реализации из учебных пособий, которые следовал, и заметил, что параметры немного отличаются для каждого из них, 1 параметр jclass, а другой jobject Я вообще не использую эти параметры, но япопытался поэкспериментировать и переключить их с jclass на jobject и jobject на 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);

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

Как правило,

  • если аргументы функции JNI имеют jclass, то эта функция JNI соответствует классу метода стороны Java (собственные методы, объявленные с" статическими «). jclass является ссылкой на текущий класс .
  • если аргументы функции JNI имеют jobject, то эта функция JNI соответствует экземпляру метода стороны Java * * (собственные методы объявлены без" статические «). jobject является ссылкой на текущий экземпляр .

В частности,

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

соответствует статическому собственному методу ( метод класса ) на вашей стороне Java, т.е.

package org.cocos2dx.cpp

class AppActivity{
    public static native void pauseSounds();
}

Пока ниже метод JNI

JNIEXPORT jstring JNICALL Java_org_cocos2dx_cpp_AppActivity_score(JNIEnv *env, jobject instance);

соответствует нативному методу ( метод экземпляра ) на вашей стороне Java, т.е.

package org.cocos2dx.cpp

class AppActivity{
   public native String score();
}

если мой метод не использует ни один из этих параметров, зачем они нужны?

Эти параметры генерируются автоматически и будут использоваться JNI при необходимости, например, в случае, если вам нужно вызвать методы Java class , вам нужно что-то вроде ниже (()V" это метод JNI подписи):

jmethodID staticMethod = env->GetStaticMethodID(clazz, "pauseSounds", "()V");

В случае, если вам нужно перезвонить методы экземпляра на стороне Java, вам нужно что-то вроде ниже (()Ljava/lang/String;" - это сигнатура метода JNI):

env->CallObjectMethod(instance, "score", "()Ljava/lang/String;");
1 голос
/ 21 мая 2019

В C все другие ссылочные типы JNI определены так же, как и задание.Например:

typedef jobject jclass;

В C ++ JNI представляет набор фиктивных классов для обеспечения взаимосвязи подтипов.Например:

class _jobject {};
class _jclass : public _jobject {};

пример использования:

JNIEnv* env = ...;
// substitute your desired class's specifier for "java/lang/Class"...
jclass cls = env->FindClass("java/lang/Class"); 
jmethodID mid_getName = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
jstring name = env->CallObjectMethod(cls, mid_getName);

эта ссылка идет на документацию Oracle для jni 6 и эта ссылка идетдокументации jni в java 8 почти тоже самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...