加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2d-x-3.x-026 移植cocos的jnihelper及用法说明

发布时间:2020-12-14 16:46:02 所属栏目:百科 来源:网络整理
导读:原文地址 https://github.com/cheyiliu/All-in-One/wiki/Cocos2d-x jni helper源码 来自cocos 3.8,头文件 “` ifndef ANDROID_JNI_HELPER_H define ANDROID_JNI_HELPER_H include include typedef struct JniMethodInfo_ { JNIEnv * env; jclass classID; jm

原文地址

  • https://github.com/cheyiliu/All-in-One/wiki/Cocos2d-x

jni helper源码

  • 来自cocos 3.8,头文件
    “`

ifndef ANDROID_JNI_HELPER_H

define ANDROID_JNI_HELPER_H

include

include

typedef struct JniMethodInfo_ {
JNIEnv * env;
jclass classID;
jmethodID methodID;
} JniMethodInfo;

class JniHelper {
public:
static void setJavaVM(JavaVM *javaVM);
static JavaVM* getJavaVM();
static JNIEnv* getEnv();

static bool setClassLoaderFrom(jobject activityInstance);
static bool getStaticMethodInfo(JniMethodInfo &methodinfo,const char *className,const char *methodName,const char *paramCode);
static bool getMethodInfo(JniMethodInfo &methodinfo,const char *paramCode);

static jmethodID loadclassMethod_methodID;
static jobject classloader;

private:
static JNIEnv* cacheEnv(JavaVM* jvm);

static bool getMethodInfo_DefaultClassLoader(JniMethodInfo &methodinfo,const char *paramCode);

static JavaVM* _psJavaVM;

};

endif // ANDROID_JNI_HELPER_H

“`

  • .cpp
    “`

include “JniHelper.h”

include “dlog.h”

include

include

include

用法

  1. 在jni onload里设置jvm
    “`

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm,void* reserved) {
// other code
// …

JniHelper::setJavaVM(vm);
return JNI_VERSION_1_4;

}
“`

  1. 在java新增一native方法,参数为context。在loadLibrary之后,在合适的地方调用该方法
    “`
    public native static int nativeInit(Context context);

在这个native的实现里,调用JniHelper::setClassLoaderFrom(obj);
jint xxx(JNIEnv* env,jclass clazz,jobject obj) {
JniHelper::setClassLoaderFrom(obj);
return 0;
}

“`

  1. 用法举例

    int getDPIJNI()
    {
    JniMethodInfo t;
    jint ret = -1;
    if (JniHelper::getStaticMethodInfo(t,"org/cocos2dx/lib/Cocos2dxHelper","getDPI","()I")) {
    ret = t.env->CallStaticIntMethod(t.classID,t.methodID);
    t.env->DeleteLocalRef(t.classID);
    }
    return ret;
    }

其他

  • 从调用方向看,c call java, cocos的jni绝大部分采用c call 静态的java方法。原因很明显,简单!
  • java call c, 没什么好说的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读