app卸载后弹出页面_html/css_WEB-ITnose
<span style="font-size:24px;">调用一个本地函数 由c/c++实现</span>
package com.lapel.catchuninstallself;public class UninstallObserver { static { System.loadLibrary("observer"); } /** * * @param path 本地安装apk路径 * @param url 卸载后弹出的页面 * @param version 本机的版本 * @return */ public static native String startWork(String path, String url, int version);}
<span style="font-size:24px;">c/c++实现</span>
<pre name="code" class="html">/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */#include <string.h>#include <jni.h>#include <jni.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <android>#include <unistd.h>#include <sys>/* 宏定义begin *///清0宏#define MEM_ZERO(pDest, destSize) memset(pDest, 0, destSize)//LOG宏定义#define LOG_INFO(tag, msg) __android_log_write(ANDROID_LOG_INFO, tag, msg)#define LOG_DEBUG(tag, msg) __android_log_write(ANDROID_LOG_DEBUG, tag, msg)#define LOG_WARN(tag, msg) __android_log_write(ANDROID_LOG_WARN, tag, msg)#define LOG_ERROR(tag, msg) __android_log_write(ANDROID_LOG_ERROR, tag, msg)/* 内全局变量begin */static char c_TAG[] = "onEvent";static jboolean b_IS_COPY = JNI_TRUE;//原包 com.zgy.catchuninstallself----------Java_com_zgy_catchuninstallself_UninstallObserver_startWork//现包 com.lapel.catchuninstallselfjstring Java_com_lapel_catchuninstallself_UninstallObserver_startWork(JNIEnv* env, jobject thiz, jstring path, jstring url, jint version) { jstring tag = (*env)->NewStringUTF(env, c_TAG); //初始化log LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY), (*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "init OK"), &b_IS_COPY)); //fork子进程,以执行轮询任务 pid_t pid = fork(); if (pid GetStringUTFChars(env, tag, &b_IS_COPY), (*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "fork failed !!!"), &b_IS_COPY)); } else if (pid == 0) { //子进程注册目录监听器 int fileDescriptor = inotify_init(); if (fileDescriptor GetStringUTFChars(env, tag, &b_IS_COPY), (*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "inotify_init failed !!!"), &b_IS_COPY)); exit(1); } int watchDescriptor; watchDescriptor = inotify_add_watch(fileDescriptor, (*env)->GetStringUTFChars(env, path, NULL), IN_DELETE); if (watchDescriptor GetStringUTFChars(env, tag, &b_IS_COPY), (*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "inotify_add_watch failed !!!"), &b_IS_COPY)); exit(1); } //分配缓存,以便读取event,缓存大小=一个struct inotify_event的大小,这样一次处理一个event void *p_buf = malloc(sizeof(struct inotify_event)); if (p_buf == NULL) { LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY), (*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "malloc failed !!!"), &b_IS_COPY)); exit(1); } //开始监听 LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY), (*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "start observer"), &b_IS_COPY)); //read会阻塞进程, size_t readBytes = read(fileDescriptor, p_buf, sizeof(struct inotify_event)); //走到这里说明收到目录被删除的事件,注销监听器 free(p_buf); inotify_rm_watch(fileDescriptor, IN_DELETE); //目录不存在log LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY), (*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "uninstalled"), &b_IS_COPY)); if (version >= 17) { //4.2以上的系统由于用户权限管理更严格,需要加上 --user 0 execlp("am", "am", "start", "--user", "0", "-a", "android.intent.action.VIEW", "-d", (*env)->GetStringUTFChars(env, url, NULL), (char *) NULL); } else { execlp("am", "am", "start", "-a", "android.intent.action.VIEW", "-d", (*env)->GetStringUTFChars(env, url, NULL), (char *) NULL); } //扩展:可以执行其他shell命令,am(即activity manager),可以打开某程序、服务,broadcast intent,等等 } else { //父进程直接退出,使子进程被init进程领养,以避免子进程僵死 } return (*env)->NewStringUTF(env, "Hello from JNI !");}</sys></unistd.h></android></string.h></stdlib.h></stdio.h></jni.h></jni.h></string.h>
android.mk 文件夹
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:=observerLOCAL_SRC_FILES:=observer.cLOCAL_C_INCLUDES:= $(LOCAL_PATH)/includeLOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -lloginclude $(BUILD_SHARED_LIBRARY)
运行后即可生成.so文件
System.loadlibray("observer")://即可完成加载,之后调用本地方法即可

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Das offizielle Konto -Webseite aktualisiert Cache, dieses Ding ist einfach und einfach und es ist kompliziert genug, um einen Topf davon zu trinken. Sie haben hart gearbeitet, um den offiziellen Account -Artikel zu aktualisieren, aber der Benutzer hat die alte Version immer noch geöffnet. Schauen wir uns in diesem Artikel die Wendungen und Wendungen und wie man dieses Problem anmutig ansehen. Nach dem Lesen können Sie sich leicht mit verschiedenen Caching -Problemen befassen, sodass Ihre Benutzer immer den frischesten Inhalt erleben können. Sprechen wir zuerst über die Grundlagen. Um es unverblümt auszudrücken, speichert der Browser oder Server einige statische Ressourcen (wie Bilder, CSS, JS) oder Seiteninhalte, um die Zugriffsgeschwindigkeit zu verbessern. Wenn Sie das nächste Mal darauf zugreifen, können Sie ihn direkt aus dem Cache abrufen, ohne ihn erneut herunterzuladen, und es ist natürlich schnell. Aber dieses Ding ist auch ein zweischneidiges Schwert. Die neue Version ist online,

Dieser Artikel zeigt einen effizienten PNG -Grenzzusatz zu Webseiten mithilfe von CSS. Es wird argumentiert, dass CSS im Vergleich zu JavaScript oder Bibliotheken eine überlegene Leistung bietet, um zu beschreiben, wie die Randbreite, Stil und Farbe für subtile oder herausragende Effekte angepasst werden können

In dem Artikel werden unter Verwendung von HTML5 -Formularvalidierungsattributen wie Erforderlich, Muster, Min, MAX und Längengrenzen erörtert, um die Benutzereingabe direkt im Browser zu validieren.

Der Artikel erörtert den HTML & lt; Datalist & gt; Element, das die Formulare verbessert, indem automatische Vorschläge bereitgestellt, die Benutzererfahrung verbessert und Fehler reduziert werden.Character Count: 159

In Artikel werden Best Practices zur Gewährleistung der HTML5-Cross-Browser-Kompatibilität erörtert und sich auf die Erkennung von Merkmalen, die progressive Verbesserung und die Testmethoden konzentriert.

Der Artikel erörtert den HTML & lt; Progress & gt; Element, Absicht, Styling und Unterschiede vom & lt; Meter & gt; Element. Das Hauptaugenmerk liegt auf der Verwendung & lt; Fortschritt & gt; Für Aufgabenabschluss und & lt; Meter & gt; für stati

Der Artikel erörtert das HTML & lt; Meter & gt; Element, verwendet zur Anzeige von Skalar- oder Bruchwerten innerhalb eines Bereichs und seine gemeinsamen Anwendungen in der Webentwicklung. Es differenziert & lt; Meter & gt; von & lt; Fortschritt & gt; und Ex

Dieser Artikel erklärt den HTML5 & lt; Time & gt; Element für semantische Datum/Uhrzeit. Es betont die Wichtigkeit des DateTime-Attributs für die Maschinenlesbarkeit (ISO 8601-Format) neben menschenlesbarem Text, das Zubehör steigert
