JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM*, void*);
jobject getGlobalContext(JNIEnv *);
jobject get_context_classLoader(JNIEnv *, jobject);
void call_loadLibrary(JNIEnv *, jobject);
extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env;
vm->GetEnv((void**) &env, JNI_VERSION_1_6);
if (pCAdd == NULL) {
pCAdd = new CAdd;
}
if (env == NULL) {
LOGI("env==NULL");
}
LOGI("env!=NULL");
void *handle = dlopen("libdvm.so", RTLD_GLOBAL);
dvmDecodeIndirectRef_ptr = (dvmDecodeIndirectRefFunc) dlsym(handle,
"_Z20dvmDecodeIndirectRefP6ThreadP8_jobject");
dvmLoadNativeCode_ptr = (dvmLoadNativeCodeFunc) dlsym(handle,
"_Z17dvmLoadNativeCodePKcP6ObjectPPc");
dvmThreadSelf_ptr = (dvmThreadSelfFunc) dlsym(handle, "_Z13dvmThreadSelfv");
jobject context = getGlobalContext(env);
gobj = context;
jobject loader = get_context_classLoader(env, context);
call_loadLibrary(env, loader);
return JNI_VERSION_1_6;
}
jobject getGlobalContext(JNIEnv *env) {
jclass activityThread = env->FindClass("android/app/ActivityThread");
jmethodID currentActivityThread = env->GetStaticMethodID(activityThread,
"currentActivityThread", "()Landroid/app/ActivityThread;");
jobject at = env->CallStaticObjectMethod(activityThread,
currentActivityThread);
jmethodID getApplication = env->GetMethodID(activityThread,
"getApplication", "()Landroid/app/Application;");
jobject context = env->CallObjectMethod(at, getApplication);
return context;
}
jobject get_context_classLoader(JNIEnv *env, jobject context) {
jclass clz = env->GetObjectClass(context);
jmethodID getClassLoader = env->GetMethodID(clz, "getClassLoader",
"()Ljava/lang/ClassLoader;");
jobject classLoader = env->CallObjectMethod(context, getClassLoader);
return classLoader;
}
void call_loadLibrary(JNIEnv *env, jobject classLoader) {
if (classLoader != NULL) {
LOGI("dvmDecodeIndirectRef_ptr:%p", dvmDecodeIndirectRef_ptr);
void *classLoader_ptr = dvmDecodeIndirectRef_ptr(dvmThreadSelf_ptr(),
classLoader);
char *reason = 0;
LOGI("------------------------dvmLoadNativeCode_ptr----------------------------");
int ret = dvmLoadNativeCode_ptr(
"/data/data/com.cmplay.tiles2/lib/libcocos2dcpp1.so",
classLoader_ptr, &reason);
LOGI("ret:%d", ret);
}