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

原文地址

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 *className,
        const char *methodName, const char *paramCode);

static jmethodID loadclassMethod_methodID;
static jobject classloader;

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

static bool getMethodInfo_DefaultClassLoader(JniMethodInfo &methodinfo,
        const char *className, const char *methodName,
        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, 沒什麼好說的。
發佈了113 篇原創文章 · 獲贊 6 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章