android9.0 java静态库操作JNI实例 动态注册
一、java层
源码
目录:/Demo/java/com/android/simpleini/SimpleJNI.java
package com.example.simplejni;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;public class SimpleJNI {private IpoManagerService(Context context) {nativeTest.LoadLibrary();if(nativeTest.mIsLoadNativeLibStatus){nativeTest.native_setIpoInitSuccFlag();Log.d(TAG, "nativeTest.native_setIpoInitSuccFlag");}else{Log.d(TAG,"nativeTest.mIsLoadNativeLibStatus="+nativeTest.mIsLoadNativeLibStatus);}}}class nativeTest{private final static String TAG_LOG = "nativeTest";static void LoadLibrary(){try {System.loadLibrary("nativeTest");mIsLoadNativeLibStatus = true;Log.d(TAG_LOG, "loadLibrary nativeTestJni OK");} catch (UnsatisfiedLinkError e) {Log.e(TAG_LOG, "loadLibrary UnsatisfiedLinkError = " + e.toString());} catch (Exception e) {Log.e(TAG_LOG, "loadLibrary Exception = " + e.toString());}}static native void native_setIpoInitSuccFlag();static boolean mIsLoadNativeLibStatus = false;}
android.bp
java_library_static {
name: "SimpleJNI",
libs: [
"xxx",
],
required:[
"libnativeTest",
],srcs: ["java/**/*.java"],
optimize: {
enabled: false,
},
}
二、JNI层
代码
源码:/demo/jni/nativeTest.cpp
/*third screen brightness adjustment
*/
#define LOG_TAG "JNI_NativeTest"
#if 0
#include "jni.h"
#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"#include <utils/misc.h>
#include <cutils/log.h>#include <stdio.h>
#include<sstream>#include <android-base/properties.h>
#include<iostream>
#endif#include <utils/Log.h>
#include <stdio.h>
#include <jni.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedUtfChars.h>
#include <android_runtime/AndroidRuntime.h>
#include "core_jni_helpers.h"
#include <string.h>
#include <cutils/properties.h>#define IPOINITOK_IPOMS_BSP_FIELPATH "/xx/xx/xx" //操作文件节点名称static const char *kClassPathName = "com/android/simplejni/nativeTest";static int write_int_to_bsp(char const* path, char* buffer, int bytes)
{int fd;if (path == NULL){ALOGE("the path==NULL");return -1;}fd = open(path, O_RDWR);if (fd >= 0) {int amt = write(fd, buffer, bytes);close(fd);if(amt == -1){ALOGE("write_int_to_bsp write [%s] failed! errno=%d", path,errno);return -errno;}else{ALOGI("write ok");return 0;}}else{ALOGE("write_int_to_bsp open [%s] failed! errno=%d", path,errno);return -errno;}}static void native_setIpoInitSuccFlag(JNIEnv *env, jobject thiz)
{char ipoinit_succ[1] = {1};ALOGD("enter JNI native_setIpoInitSuccFlag()");write_int_to_bsp(IPOINITOK_IPOMS_BSP_FIELPATH,ipoinit_succ,1);
}static JNINativeMethod methods[] = {{"native_setIpoInitSuccFlag", "()V", (void *)native_setIpoInitSuccFlag},
};/*
int register_com_mediatek_ipomanager_IpoManagerService(JNIEnv *env) {return jniRegisterNativeMethods(env, kClassPathName, method_table, NELEM(method_table));
}
*//*
* Register several native methods for one class.
*/
static int registerNativeMethods(JNIEnv* env, const char* className,JNINativeMethod* gMethods, int numMethods)
{jclass clazz;clazz = env->FindClass(className);if (clazz == NULL) {ALOGE("Native registration unable to find class '%s'", className);return JNI_FALSE;}if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {ALOGE("RegisterNatives failed for '%s'", className);return JNI_FALSE;}return JNI_TRUE;
}/*
* Register native methods for all classes we know about.
*
* returns JNI_TRUE on success.
*/
static int registerNatives(JNIEnv* env)
{
if (!registerNativeMethods(env, kClassPathName,methods, sizeof(methods) / sizeof(methods[0]))) {return JNI_FALSE;
}return JNI_TRUE;
}typedef union {JNIEnv* env;void* venv;
} UnionJNIEnvToVoid;jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
{UnionJNIEnvToVoid uenv;uenv.venv = NULL;jint result = -1;JNIEnv* env = NULL;ALOGI("JNI_OnLoad");if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {ALOGE("ERROR: GetEnv failed");goto bail;}env = uenv.env;if (registerNatives(env) != JNI_TRUE) {ALOGE("ERROR: registerNatives failed");goto bail;}result = JNI_VERSION_1_4;bail:return result;
}
android.mk
路径:/demo/jni/android.mk
#
# Copyright (C) 2008 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.
#
# This makefile supplies the rules for building a library of JNI code for
# use by our example platform shared library.
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
# This is the target being built.
LOCAL_MODULE:= libnativeTest
# All of the source files that we will compile.
LOCAL_SRC_FILES:= \
nativeTest.cpp
# All of the shared libraries we link against.
LOCAL_SHARED_LIBRARIES := \
libnativehelper \
libcutils \
libutils \
liblog \
libandroid_runtime
# No static libraries.
LOCAL_STATIC_LIBRARIES :=
# Also need the JNI headers.
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE)
LOCAL_CFLAGS += -Wall -Werror -Wunused-parameter -Wno-unused-parameter
include $(BUILD_SHARED_LIBRARY)
相关文章:
android9.0 java静态库操作JNI实例 动态注册
一、java层 源码 目录:/Demo/java/com/android/simpleini/SimpleJNI.java package com.example.simplejni;import android.app.Activity; import android.os.Bundle; import android.widget.TextView;public class SimpleJNI {private IpoManagerService(Context …...
自定义复杂图片水印
我的社交能力还不如5岁儿童和狗。 文章目录前言一、主要工具类总结前言 之前写过一些简单的图片压缩和图片加水印:JAVA实现图片质量压缩和加水印 本次主要是针对图片加水印进行一个升级,图片水印自定义,自适应大小。 来,先看几…...
文章读后感——《人间清醒,内容为王》
观后感 人间清醒,内容为王 - 技术er究竟该如何写博客?1024上海嘉年华之敖丙演讲观后感。 致敬愿意带领后生的前辈——哈哥 哈哥,《人间清醒,内容为王》这篇,我的鱼获, 是里面传递出来写技术博客的思维与想法…...
51单片机入门 - 驱动多位数码管
我使用的是普中51单片机开发板A2套件(2022),驱动数码管可能需要参考电路原理图。开发环境的搭建教程在本专栏的 51单片机开发环境搭建 - VS Code 从编写到烧录 有过介绍。 关于我的软硬件环境信息: Windows 10STC89C52RCSDCC &am…...
Java进击框架:Spring(一)
Java进击框架:Spring(一)前言创建Spring项目Spring IoC容器和Beans介绍Bean的概述Spring IoC配置元数据实例化Bean依赖注入循环依赖详细配置生命周期回调Bean定义继承基于注解的容器配置Component和进一步的原型注解自动检测类和注册Bean定义…...
Java笔记(18)
目录 什么是mvc? 什么是SpringMVC Spring MVC的特点: 原理: 什么是Thymeleaf? thymeleaf依赖包:...
【免费教程】地下水环境监测技术规范HJ/T164-2020解读使用教程
地下水环境监测技术规范依据《中华人民共和国环境保护法》第十一条“国务院环境保护行政主管部门建立监测制度、制订监测规范”和《中华人民共和国水污染防治法》的要求,积极开展地下水环境监测,掌握地下水环境质量,保护地下水水质࿰…...
Html 代码学习
场景:在页面中插入音频 代码 常见属性: src 音频的路径 controls 显示播放的控件 autoplay 自动播放 loop 循环播放 场景:在页面中插入视频 代码 常见属性: src 路径 controls 显示播放的控件 autoplay 自动播放 要配合muted 例如 autoplay muted loop 循环播放 链接 /…...
如何通过IP找到地址?
在我们印象中,我们都知道可以通过 IP 地址找到某个人。但当我们细想一下,我们会发现其实 IP 地址与地理位置并不是直接相关的。那我们到底是如何通过 IP 地址找到地址的呢?答案是:通过自治系统(Autonomous System&…...
业务单据堆积如山?如何提升会计做账效率?
某集团以“创建现代能源体系、提高人民生活品质”为使命,形成了贯通下游分销、中游贸易储运、上游生产的清洁能源产业链和涵盖健康、文化、旅游、置业的生命健康产品链。目前,某集团在全国21个省,为超过2681万个家庭用户、21万家企业提供能源…...
华为OD机试题,用 Java 解【VLAN 资源池】问题
最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…...
面试加分项:JVM 锁优化和逃逸分析详解
1 锁优化JVM 在加锁的过程中,会采用自旋、自适应、锁消除、锁粗化等优化手段来提升代码执行效率。1.1 自旋锁和自适应自旋现在大多的处理器都是多核处理器 ,如果在多核心处理器,有让两个或者以上的线程并行执行,我们可以让一个等待…...
C++继承、构造函数和析构函数
构造函数 与 析构函数 构造函数代表一个对象的生成,主要作用是初始化类的成员变量,可以被重载 如果没有显式构造函数,则实例化对象时,系统会自动生成一个无参的构造函数 构造函数的名称与类名相同 析构函数代表的是一个对象的销…...
Python如何实现异步并发之async(1)
前言 本文是该专栏的第14篇,后面会持续分享python的各种干货知识,值得关注。 在python中使用async方式,实现异步并发,而本文笔者提到的代码案例仅支持python3.7及以上版本,这主要在于不同的版本之间都更新了异步的使用方法,这点暂时不详述了。 而所谓的异步,通常就是程…...
震撼!阿里首次开源 Java 10万字题库,Github仅一天星标就超60K
程序员面试 现在是程序员找工作、跳槽最重要的月份。随着行业的发展程序员面试也越来越难,面试中都是7分的能力,再加上3分的技巧; 对于应聘者,重中之重的就是简历,面试前一定要将最拿手和最能吸引面试官的技能在简历…...
十三、RESTful API
RESTful API 什么是RESTful REST一词,是Roy Thomas Fielding在他2000年的博士论文中提出的。 Fielding是一个非常重要的人,他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。所…...
路由器防火墙配置(14)
实验目的 通过本实验,理解路由器的防火墙工作原理,掌握路由器的防火墙功能配置方法,主要包括网络地址转换功能和数据包过滤功能的配置。 培养根据具体环境与实际需求进行网络地址转换及数据包过滤的能力。 预备知识网络地址转换 网络地址转…...
灰狼算法优化VMD对时序信号分析python
VMD算法变分模态分解(VMD)算法是一种根据变分方程计算,将信号分析过程转换成求解变分方程的过程,具体分析过程可见前面写的另外一篇博客VMD,这里不多介绍。 VMD算法在进行信号分析时,将一段时序信号分解成不同频段的几个子信号,但其分解效果的好坏由其两个参数影响较大—…...
微服务架构中的多级缓存设计还有人不懂?
今天我们来聊聊缓存这个话题,看看在微服务环境下如何设计有效的多级缓存架构。主要涉及三方面内容: Web 应用的客户端缓存;应用层静态资源缓存;服务层多级缓存。 首先,咱们先讲解微服务架构的多级缓存设计。 微服务…...
【图神经网络 医学/药物/目标/分子/(结构/相互作用)预测】用于药物-目标相互作用预测的元集合(Metapath)异构图神经网络(MHGNN)
May the immensity of the universe, guide us to meet again. 我个人觉得这篇Paper很好。哈哈! 本次学习的Paper于2023年1月15日索引于 Web of Science,是比较新的。 作者:中国天津,南开大学计算机科学学院。 本篇Paper的研究方向(类别/分类):生物化学 & 分子生物学…...
终极罗技鼠标宏压枪指南:告别PUBG后坐力困扰的3个秘诀
终极罗技鼠标宏压枪指南:告别PUBG后坐力困扰的3个秘诀 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为绝地求生中的武器后坐力…...
查询直线的条数
#include <iostream> #include <vector> #include <set> #include <numeric> // For std::gcdusing namespace std;// 定义点结构 struct Point {int x, y; };// 定义直线结构,通过最简斜率和直线上的一点来唯一标识 // 实际上更好的办法是…...
Jimeng LoRA动态热切换实战:避免显存爆炸,轻松测试多训练阶段模型
Jimeng LoRA动态热切换实战:避免显存爆炸,轻松测试多训练阶段模型 1. 项目背景与核心价值 你是否遇到过这样的困扰:在测试不同训练阶段的LoRA模型时,每次切换版本都需要重新加载底座模型,不仅耗时耗力,还…...
3个颠覆性技巧:NVIDIA Profile Inspector如何释放显卡隐藏性能
3个颠覆性技巧:NVIDIA Profile Inspector如何释放显卡隐藏性能 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款专业的显卡参数配置工具,能够深度…...
Linux 软件安装没你想的那么简单:为什么有的软件能直接跑,有的非装不可?
Linux 软件安装没你想的那么简单:为什么有的软件能直接跑,有的非装不可? 很多人刚接触 Linux 的时候,对“安装软件”这件事有点迷。 在 Windows 上,大家已经习惯了: 双击一个 exe一路“下一步”软件出现在桌…...
Retinaface+CurricularFace模型部署实战:Windows11环境配置全攻略
RetinafaceCurricularFace模型部署实战:Windows11环境配置全攻略 想在Windows11上快速搭建人脸识别系统却苦于环境配置?本文手把手带你避开所有坑,30分钟完成RetinafaceCurricularFace的完整部署。 1. 环境准备:搞定CUDA和cuDNN …...
PowerShell-Suite终极指南:10个高级Windows安全工具深度解析
PowerShell-Suite终极指南:10个高级Windows安全工具深度解析 【免费下载链接】PowerShell-Suite My musings with PowerShell 项目地址: https://gitcode.com/gh_mirrors/po/PowerShell-Suite PowerShell-Suite是一个功能强大的Windows安全工具集合ÿ…...
Qwen-Image-2512-Pixel-Art-LoRA 生成像素画音效可视化波形图
Qwen-Image-2512-Pixel-Art-LoRA:当像素画“听见”声音 你有没有想过,声音也能被“画”出来?不是那种抽象的频谱图,而是充满想象力的像素画。最近,我尝试用Qwen-Image-2512模型,结合一个像素艺术风格的LoR…...
Appium自动化测试卡在iOS签名?手把手教你搞定Provisioning Profile与entitlements不匹配的坑
Appium自动化测试卡在iOS签名?手把手教你搞定Provisioning Profile与entitlements不匹配的坑 当你兴致勃勃地准备开始iOS自动化测试时,突然遇到"Provisioning profile doesnt match the entitlements files value for the get-task-allow entitleme…...
5步搞定:Z-Image-Turbo_UI界面LoRA使用教程,轻松玩转多种画风
5步搞定:Z-Image-Turbo_UI界面LoRA使用教程,轻松玩转多种画风 作为一名AI绘画工具的重度使用者,我深知新手最需要的是什么——不是复杂的参数解释,而是简单明了的操作指南。今天要介绍的Z-Image-Turbo_UI界面,可能是你…...
