怎样能缩短android平台的android 获取安装时间间

8851人阅读
一步步摸索着开发走来,本着能走通就继续往前走的原则,将dlna项目做到了现在,做到了出产品。
可是一直有一个问题困扰着我,为什么我们的程序不能覆盖***?其他的android应用程序,无论带不带动态库,都可以实现覆盖***,不用很麻烦地一步步进行手动清除数据/手动卸载/然后才能***的问题。否则,如果直接***,可能会导致so包更新失败的问题,会继续使用旧的so包。更搞笑的是,即便把某个so包删除,程序也不会报错,即便用到了该so包中的某个库函数,仍会继续运行下去。这个问题无法容忍。
在网上搜索android上需要手动清除数据/手动卸载的原因及解决方法,发现根本找不到这方面的资料。
在一个开源平台上,别人都不会碰到同样的问题吗?只能说明一个问题,这个问题,要么太深奥,要么太简单。我想到了自从一开始就一直萦绕在我心头的一个初始化函数的实现:JNI_OnLoad
又一次详细地看了JNI_OnLoad这个函数可能带来的好处:初始化,定义最低JNI版本,注册方法。 抱着试试看的心态,试着写这个函数,梦想着能够解决问题。
结果,大功告成!^_^
(1)这次dms/dmr/dmc三个JNI文件中的native方法很多,工作量不小,但是效率却比较高。我想这是平时积累见到的成效。
(2) 关于获取env及规定最低版本,以前尝试写在JNI_OnLoad里,但是出错,但是现在却对了;直接获取类的ID的方法FindClass,以前没有JNI_OnLoad方法的时候,将它用在nativesetup方法里,出错,在nativesetup方法里,就只能用FindObjectClass可用了。以前不能用,现在可用,应该是某个地方细微的差别导致的。如果学艺不精,解决问题会很浪费时间,什么都要查资料。累积的知识到了一定的程度,即便碰到问题,也能很快找出原因并解决。
(3)在开发过程中碰到方法注册失败的问题。如果Java文件里没有相应的native方法,在底层接口中最好将其注释掉,免得导致注册失败。这个问题的解决关键,在于从C++代码跳到Java代码来解决问题的思路。
做开发,多积累,准没错,它的成效会比你想象的还要好。
现在贴上部分代码,以备留念。
//methods table
static JNINativeMethod gMethods[] = {
&(Ljava/lang/O)V&,
(void *)Java_com_hr_renderer_dmr_A},
&(Ljava/lang/S)I&,
(void *)Java_com_hr_renderer_dmr_B},
&(Ljava/lang/S)I&,
(void *)Java_com_hr_renderer_dmr_C},
(void *)Java_com_hr_renderer_dmr_D},
&()Ljava/lang/S&,
(void *)Java_com_hr_renderer_dmr_E},
&()Ljava/lang/S&,
(void *)Java_com_hr_renderer_dmr_F},
&(Ljava/lang/SLjava/lang/S)V&,
(void *)Java_com_hr_renderer_dmr_G},
&(Ljava/lang/S)I&,
(void *)Java_com_hr_renderer_dmr_H},
&(Ljava/lang/S)Ljava/lang/S&,
(void *)Java_com_hr_renderer_dmr_I},
(void *)Java_com_hr_renderer_dmr_J},
define the minimum version
initialization
register native methods.
jint JNI_OnLoad(JavaVM* vm, void* reserved)
NPT_LogManager::GetDefault().Configure(&plist:.level=INFO;.handlers=ConsoleH.ConsoleHandler.colors=.ConsoleHandler.filter=42&);
JNIEnv* env = NULL;
jint result = -1;
if (vm-&GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)
NPT_LOG_INFO(&JNI version error!&);
//assert(env != NULL);
if (env == NULL)
NPT_LOG_INFO(&JNI-----getEnv fail.&);
env-&GetJavaVM(&gJavaVM);
if (env-&ExceptionOccurred())
NPT_LOG_INFO(&JNI-----GetJavaVM fail.&);
clazz = env-&FindClass(classPathName);
if (clazz == NULL)
NPT_LOG_INFO_1(&JNI Cannot find %s!&, classPathName);
//get MethodID
postEventMethodID = env-&GetStaticMethodID(clazz, &postEvent&, &(Ljava/lang/OILjava/lang/SLjava/lang/S)V&);
//if ExceptionOccurred
if (env-&ExceptionOccurred())
NPT_LOG_INFO(&JNI-----GetStaticMethodID fail.&);
//register methods.
if (env-&RegisterNatives(clazz, gMethods, sizeof(gMethods)/sizeof(gMethods[0])) & 0)
NPT_LOG_INFO(&JNI-----RegisterNatives fail.&);
NPT_LOG_INFO(&JNI_OnLoad-----sucess!&);
return JNI_VERSION_1_4;
/* UnregisterNatives
void JNI_OnUnload(JavaVM* vm, void* reserved)
JNIEnv* env = NULL;
if (vm-&GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)
NPT_LOG_INFO(&JNI UnregisterNatives: get env fail&);
NPT_LOG_INFO(&JNI_OnUnload Unregister!&);
env-& UnregisterNatives(clazz);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:144715次
积分:1962
积分:1962
排名:第15961名
原创:59篇
转载:11篇
评论:67条
(1)(2)(2)(2)(1)(2)(1)(2)(3)(2)(6)(4)(3)(8)(30)(1)

参考资料

 

随机推荐