jni中load *.so

来源:互联网 发布:ds证据理论 软件 编辑:程序博客网 时间:2024/06/05 17:42


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);
}
0 0