http://www.cnblogs.com/oloroso/p/4688426.html gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题...dso.o:在函数‘dso_load(char const*, char const*)’中: dso.cpp:(.text+0x3c):对‘dlopen’未定义的引用 dso.cpp:(.text+0x4c...):对‘dlsym’未定义的引用 dso.cpp:(.text+0xb5):对‘dlerror’未定义的引用 dso.cpp:(.text+0x13e):对‘dlclose’未定义的引用 原因 出现这种情况的原因...但是在链接为可执行文件的时候就必须要具体的实现了。如果错误是未声明的引用,那就是找不到函数的原型,解决办法这里就不细致说了,通常是相关的头文件未包含。...但是看上面编译的时候是有添加-ldl选项的,那么为什么不行呢? gcc 依赖顺序问题 这个主要的原因是gcc编译的时候,各个文件依赖顺序的问题。
默认,所有iOS设备在过了设定的休眠时间后,都会自动锁屏。 如果你的应用不希望iOS设备自动锁屏,可以使用以下方式来保持屏幕一直开着。...UIApplication sharedApplication].idleTimerDisabled = YES; ---- Previous 为自己的网站实现
(jni-util.cc):213 ---hdfsConnect 可以看到,Impala并不是直接调用JNI的JNI_CreateJavaVM方法来创建Jvm的。...在hdfs的c++库中,通过调用JNI_CreateJavaVM方法,创建了一个新的Jvm。...关于JNI_CreateJavaVM方法的官方解释如下所示: JNI_CreateJavaVM jint JNI_CreateJavaVM(JavaVM **p_vm, void **p_env, void...可以看到,在这个过程中,coordinator和catalogd都通过JNI调用实现了BE和FE之间的交互。 FE端调用BE端的方法 上面介绍了Impala如何在BE端调用FE的方法。...catalogd获取所需的元数据,即“Fetch-on-demand”,这个过程就涉及到了FE端对BE方法的调用。
1 JNI定义 JNI(Java Native Interface),即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互....以下是oracle对JNI的定义 JavaTM Native Interface (JNI) is a standard programming interface for writing Java...JavaVM结构体,该结构体在创建Java虚拟机时被返回,在JNI环境中创建JVM的函数为JNI_CreateJavaVM。...JavaVM的获取方式: 第一种方式,在加载动态链接库的时候,JVM会调用JNI_OnLoad(JavaVM* jvm, void* reserved)(如果定义了该函数)。...第二种方式,在native code中调用JNI_CreateJavaVM(&jvm, (void*)&env, &vm_args)可以得到JavaVM指针。
JNI_CreateJavaVM,函数里面需要设置pJavaVM, pEnv指针,是为了后续的销毁虚拟机等操作。...0x05:JNI_CreateJavaVM 源码见Jni.cpp 在JNI_CreateJavaVM中,主要做了几件事情: 根据参数,填充了gDvm中的相关参数 关于gDvm:它的定义在Globals.h...初始化了JavaVMExt、JNIEnvExt等指针,这些分别对应的JNI中的JavaVM、JNIEnv,在JNI调用中必不可少。...这些类来自于libcore中,对应的c实现在dalvik下。 dvmJniStartup,初始化了jni的全局引用表和全局弱引用表。...= 0 简单校验线程相关的local引用表当前是空的 dvmDebuggerStartup, 初始化调试相关的东西,比如断点什么的 dvmGcStartupClasses, 调用Ljava/lang
折腾了两天总算搞定c调用jar包,其中遇到的问题这里总结一下: 1、起始demo 参考C调用java例子先跑起来 2、开发环境 使用linux虚拟机效率很低,找到了gnuwin32实现在windows...下运行Makefile,使用的是https://sourceforge.net/projects/gnuwin32/ ,只需要把 mingw32-make.exe文件改名为make.exe 3、java...com.test.mytest.App 能够执行成功(jar复制到c文件同一个目录,不成功估计是第7条的问题) 4、jar的调用 options.optionString ="-Djava.class.path...;mytest.jar"; args.options = &options; args.ignoreUnrecognized = 0; int rv; rv = JNI_CreateJavaVM...= create_vm(&jvm); if(env == NULL) return 1; invoke_class(env); return 0; } 如果不用Makefile
从Java到C/C++建立的是函数间的关联 而从C/C++到Java,必须先得到Java对象的引用,才能调用该对象的方法 另外,请记住,一旦使用 JNI,Java 程序就丧失了 Java 平台的两个优点...if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) { ALOGE("JNI_CreateJavaVM failed\n");...return -1; } return 0; } 复制代码 又调用到了JNI_CreateJavaVM,来看看: extern "C" jint JNI_CreateJavaVM(JavaVM...中的引用 在JNI中有三种引用:本地引用(LocalReference)、全局引用(GlobalReference)、弱全局引用(WeakGlobalReference)。...debug.checkjni 1 复制代码 总结 本篇只是对JNI使用上的技巧进行了比较简单的总结。
/jni_helper.c:505: undefined reference to `JNI_CreateJavaVM' /root/hadoop-2.4.0-src/hadoop-hdfs-project.../hadoop-hdfs/src/main/native/libhdfs/jni_helper.c:505: undefined reference to `JNI_CreateJavaVM'.../third-party/libjvm.so | grep JNI_CreateJavaVM nm: ../.....本程序是自由软件;您可以按照 GNU 通用公共许可证 的条款对其进行再发行。本程序没有任何担保。 现在换成高一点的版本试试: ..../nm libjvm.so | grep JNI_CreateJavaVM 00000000006307c0 T JNI_CreateJavaVM 实际应用中,编译虽然存在此问题,但运行时,
在Radare2静态分析apk(1) 对Radare静态分析apk进行了简单的介绍。 补充一下: 通过r2 apk://URI可以直接对apk中的dex进行分析。...Android平台pic(位置无关代码)编译的原因,所有全局变量的引用都是通过got(全局偏移表)完成的,加载器会根据加载基址来修正,并向got填入正确的全局变量的地址。...if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) { ALOGE("JNI_CreateJavaVM failed\n");..._(p_vm, p_env, vm_args); } NIEnv是在Zygote初始化的时候调用libart.so中的"JNI_CreateJavaVM"方法创建的。...所有的JNI调用都使用了JNIEnv*类型的指针,习惯上在CPP文件中将这个变量定义为evn,它是任意一个本地方法的第一个参数。
//JNI_CreateJavaVM_函数指针指向虚拟机库中的JNI_CreateJavaVM函数 if (!...//创建java虚拟机 if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) { ALOGE("JNI_CreateJavaVM...failed\n"); return -1; } return 0; } JNI_CreateJavaVM()是JniInvocation.cpp中的函数,会调用到①...中所说的JNI_CreateJavaVM_()函数指针,最后调用到相应虚拟机动态库中的JNI_CreateJavaVM()函数,创建对应的虚拟机。...如果jni函数比较少,这么做确实可行,但是我们可以看到gRegJNI数组是很庞大的,需要映射的函数也很多,如果全部交给虚拟机映射,会大大降低虚拟机的执行性能,所以我们提前注册JNI函数,虚拟机就可以直接找到对应的函数进行调用
,并找到创建虚拟机的入口函数JNI_CreateJavaVM存储到结构体InvocationFunctions中。...之后再JavaMain函数中,会根据JNI_CreateJavaVM虚拟机创建函数来初始化虚拟机,此时已经是在一个新的线程中运行了。...JNI_CreateJavaVM //这里会区分不同平台和CPU位数,但大体上就是使用dlopen和dlsym这个两个系统调用来实现 if (!...; //调用JNI_CreateJavaVM函数创建虚拟机,该函数内部会转调JNI_CreateJavaVM_inner函数 r = ifn->CreateJavaVM(pvm...VMThread用于执行VMOptions 初始化主要JDK类,如String类、System类,Class类、线程/线程组类、Module类,还有其他反射、异常相关的类 初始化jni方法的快速调用 标记虚拟机的基本初始化完成
除了本身框架的使用之外,凡是使用java语言开发的系统都避免不了对jvm的调优(对于系统性能要求不高可能不需要,但是对于互联网公司来说性能好像是对系统的基本要求)。...(3)LoadJavaVM:动态加载jvm.so这个共享库,并把jvm.so中的相关函数导出并且初始化,例如JNI_CreateJavaVM函数。...JNI_CreateJavaVM函数真正的开始启动一个jvm的,这个函数会做很多的初始化工作,基本上一个完整的jvm信息在这个函数里面都能够看到,后面单独详细讲解这个函数。...)JavaMain->InitializeJVM(初始化jvm,这个函数调用jvm.so里面导出的CreateJavaVM函数创建jvm了,JNI_CreateJavaVM这个函数很复杂)->LoadMainClass...一个就是初始化和启动真正的jvm,由动态链接库jvm.so中的JNI_CreateJavaVM实现,另外一个就是最后查找入口类以及查找main入口函数的具体实现。
,最终会调用到libjvm.so中对应的以JNI_Xxx开头的方法,其中JNI_CreateJavaVM()方法会在InitializeJVM()函数中调用,用来初始化2个JNI调用时非常重要的2个参数...InvocationFunctions结构体下 // 的CreateJavaVM()函数指针来实现,该指针在LoadJavaVM()函数中指向libjvm.so动态链接库中JNI_CreateJavaVM...调用InitializeJVM()函数初始化JVM,主要就是初始化2个非常重要的变量JavaVM与JNIEnv,在这里不过多探讨这个问题,后面在讲解JNI调用时会详细介绍初始化过程。...调用本地函数jni_DetachCurrentThread()断开与主线程的连接。...当成功与主线程断开连接后,当前线程一直等待程序中所有的非守护线程全部执行结束,然后调用本地函数jni_DestroyJavaVM()对JVM执行销毁。
源代码只有JVM等核心代码是用C/C++编写,一些类库还是Java编写的,最后需要编译为class文件,这部分的工作需要另外一个JDK来编译;网上说编译8的JDK要用1.7的,我用1.8的也可以编译通过...,我用的版本是1.8.0_231。...enable-debug-symbols和with-native-debug-symbols:都是开启调试信息的,第1次编译的时候只开启了enable-debug-symbols,调试JVM相关函数的时候没有断点信息...用yum安装就可以了;还有就是编译参数,修改相关Makefile就可以。...一些关键的函数如下: JNI_CreateJavaVM JNI_GetDefaultJavaVMInitArgs JNI_GetCreatedJavaVMs JavaMain create_vm
oracle中关于JNI的指导 Java调用C/C++在Java语言里面本来就有的,并非Android自创的,即JNI。JNI就是Java调用C++的规范。...即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。...的函数为JNI_CreateJavaVM。...JNI_CreateJavaVM(JavaVM **pvm, void **penv, void*args); 1、JavaVM ?...JVM与JavaVM.png 其中JavaVM是Java虚拟机在JNI层的代表,JNI全局仅仅有一个JavaVM结构中封装了一些函数指针(或叫函数表结构),JavaVM中封装的这些函数指针主要是对JVM
本文将从源码角度看下Java的main方法是如何被调用的。...jvmpath), jvmcfg, sizeof(jvmcfg)); ... // 加载libjvm.so,并获取其 JNI_CreateJavaVM.... // 该方法会调用libjvm.so里的JNI_CreateJavaVM方法对JVM进行初始化 if (!...0 : 1; LEAVE(); } 该方法就是我们的最终方法,它会先调用InitializeJVM初始化JVM,再通过一系列的方法获取mainClass、mainArgs,最终调用(*env)-...有关(*env)->CallStaticVoidMethod究竟是如何执行的Java main方法,以及Java main方法又是如何调用的其他Java方法,我们之后会另起文章详细分析。
JVM.dll文件的装载: 1、LoadLibrary方法装载JVM.dll动态连接库; 2、把JVM.dll文件中定义的函数JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArgs...AddOption核心就是对-Xss参数进行特殊处理,并设置threadStackSize,因为参数格式比较特殊,其它是key/value键值对,它是-Xss512的格式。...的CreateJavaVM方法,即调用JVM.dll函数JNI_CreateJavaVM,新建一个JVM实例,该过程比较复杂,会在后续文章进行分析。...最终调用JVM.dll函数jni_GetStaticMethodID实现。 ? 其中get_method_id方法根据类文件对应的instanceKlass对象查找指定方法。...1、重新创建参数数组; 2、其中mainID是main方法的入口地址,CallStaticVoidMethod方法最终调用JVM.dll中的jni_CallStaticVoidMethodV函数。
,调用本例的构造方法生成一个Launcher实例。...注:加载器的父子关系不是继承上的父子关系,而是通过成员变量引用,以组合的方式实现的父子关系 1.2 JVM是如何启动的 程序的主要入口点在main.c,代码中有大量的条件编译,我们直接看JLI_Launch...回到LoadJavaVM函数中,会根据jvmpath加载dll文件,然后初始化JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArgs函数地址。 ... 其中调用的CreateJavaVM函数,在前面已经初始化,使用JNI来调用JNI_CreateJavaVM(jvm.dll)。..., void* pArgs); 1.3 C++层面的类加载器 前面我们简单介绍了jvm的启动过程,进入jni.cpp中,调用Threads::create_vm((JavaVMInitArgs*)
Android 5.0以后,对skia图形的系统设置去掉了,只保留有调用 mOptions.setCapacity(20);来设置虚拟机的参数 4、启动虚拟机即AndroidRuntime的start...,并且调用它的成员函数init来初始化JNI环境。...也就是说,libvm.so和libart.so导出了JNI_GetDefaultJavaVMInitArgs、JNI_CreateJavaVM和JNI_GetCreatedJavaVMs这三个接口,供外界调用...第10部分:添加其他虚拟机的选项。 第11部分:重点部分,通过调用JNI_CreateJavaVM函数来创建及初始化一个虚拟机实例。...libart.so导出的JNI_CreateJavaVM_接口,即JNI_CreateJavaVM的真正实现是由libart.so完成的。
; return JNI_TRUE; } dlopen 和 dlsym 涉及动态链接,简单理解就是 libjvm.so 包含 JNI_CreateJavaVM、JNI_GetDefaultJavaVMInitArgs...插一句,我是真的不喜欢按照函数调用的方式讲述问题,a 调用 b,b 又调用 c,简直是在浪费篇幅,但是有些地方跨度太大又怕引起误会(尤其对初学者而言)。...InitializeJVM 会调用 ifn->CreateJavaVM,也就是libjvm.so 中的 JNI_CreateJavaVM。...系统调用的结果由 eax 返回,第 8 步判断 clone 系统调用的结果,对当前进程而言,clone 系统调用如果成功返回的是新线程在它的 pid namespace 中的 id,大于 0,所以它执行...对新线程而言,clone 系统调用的返回值等于 0,所以它执行L(thread_start) 处的代码。
领取专属 10元无门槛券
手把手带您无忧上云