2.Java基础

每个ClassLoader必须有一个父ClassLoader,在装载Class文件时,子ClassLoader会先请求其父ClassLoader加载该Class文件,只有当其父ClassLoader找不到该Class文件时,子ClassLoader才会继续装载该类。

dex文件时一种经过优化的Class文件,要加载这样特殊的Class文件需要特殊的类装载器,这就是DexClassLoader。

插件化架构,provided方式plugin只编译依赖的共同接口,不打包进apk。

获取插件程序中的资源

res = pm.getResourcesForApplication(packageName);
int id = res.getIdentifier("resname", "string", packageName);
String resname = res.getString(id);

当Java调用native时,编译器会向native引擎传递调用者的包名,函数名称还有参数类型,native引擎根据这些信息决定应该具体调用哪个本地函数。native引擎中AndroidRuntime类提供了一个registerNativeMethods()函数,可以通过该函数来定义Java native函数和C函数名称的映射关系。

javah -d $PWD -jni com.solarexsoft.nativefunctions.FooBar

-d选项的含义是指定输出路径,-d必须在-jni前面,-jni选项的意思是产生jni头文件,后面的类名是Class文件所在的路径。

Java代码中不能直接访问C中的变量,原因很简单,C中的变量对于Java来讲都是私有的。如果想访问某个变量,那么就让C提供一个get/set方法,以达到间接访问的目的。

由于Java中函数在native引擎中并没有直接的函数指针,Java函数只能由Java引擎去执行,而不是C。所以,C访问Java不能通过函数指针,而只能通过通用的参数接口,正如Java调用C一样。Java把类名、函数名称、参数类型传递给native引擎,然后由native引擎处理C函数,同理,C调用Java时,也需要把想要访问的类名、函数名称、参数传递给Java引擎。

javap -s com/solarexsoft/nativefunctions/Foo查看函数签名。

ThreadLocal,Handler,MessageQueue,Looper

results matching ""

    No results matching ""