Android JNI模板与读取系统属性笔记

安卓JNI编程知识点,Java与C++交互 1 Java中声明 (1) native方法是被编译成一个共享库,需要先加载这个库告诉java编译器 static { System.loadLibrary("hello-jni");// 共享库的名字libhello-jni.so } (2) native 方法告诉java虚拟机该方法是用别的语言实现的 public native String stringFromJNI(); 2 C++层实现 #include <string.h> #include <jni.h> jstr 阅读详情

一、编写目的

本文主要提供一个简单可用的 jni 模板,便于在APK中编写native代码。通过记录,希望能对jni学习有一个更深的认识。

二、APP中的jni模板

1、jni文件在项目中的截图

这里写图片描述

2、详细步骤
1)、在src/main/ 层,创建jni目录用于存放,native代码
2)、增加Android.mk
# Android.mk for check is rightful board

LOCAL_PATH := $(call my-dir)

# Program
include $(CLEAR_VARS)
LOCAL_MODULE := nativeXXXX
LOCAL_SRC_FILES := nativeXXXX.c
LOCAL_C_INCLUDES += $(LOCAL_PATH)    // 配置头文件目录,根据实际修改
LOCAL_LDLIBS := -llog -lz    // 添加静态依赖库,编译需要
LOCAL_SHARED_LIBRARIES := libcutils    // 添加动态依赖库,读取系统属性需要
include $(BUILD_SHARED_LIBRARY)
3)、增加Application.mk
APP_ABI :=armeabi-v7a     // 指定编译哪些CPU架构
4)、增加nativeXXXX.c
//
// Created by LinChengChun on 2018/1/2.
//

#include "nativeXXXX.h"

static const char *ClassName = "com/example/XXXX"; // 包名

jint test(JNIEnv *env, jobject jobj){
    char *key = "ro.build.id";
    char value[PROP_VALUE_MAX] = {0};
    int ret = __system_property_get(key, value);
    if(ret <= 0 ){
        return -1;
    }

    ret = strcmp(value, "XXXX");
    if(ret != 0){
        return -1;
    }

    return 0;
}

static JNINativeMethod METHODS[]={
        {"test","()I",(void *)test}
};


JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
    int retVal = -1;
    JNIEnv *env;
    if ( (*vm)->GetEnv(vm,(void **) &env, JNI_VERSION_1_4) == JNI_OK  ) {
        jclass clazz = (*env)->FindClass(env,ClassName);
        if (clazz != NULL) {
            if ((*env)->RegisterNatives(env,clazz, METHODS,sizeof(METHODS) / sizeof(METHODS[0])) >= 0) {
                retVal = JNI_VERSION_1_4;
            }else{
                LOGI("RegisterNatives Subprocess.create method failed!");
            }
            (*env)->DeleteLocalRef(env,clazz);
        }else{
            LOGI("className not found!");
        }
    }
    return retVal;
}

JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved)
{
}
5)、增加nativeXXXX.h
//
// Created by LinChengChun on 2018/1/2.
//

#ifndef XXXX_ANDROID_NATIVEXXXX_H
#define XXXX_ANDROID_NATIVEXXXX_H

#include <jni.h>
#include <assert.h>
#include <string.h>
#include <sys/types.h>
#include <android/log.h>
#include <sys/system_properties.h>

#define LOG_TAG "NativeXXXX"
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))

#endif //XXXX_ANDROID_NATIVEXXXX_H
6)、在JAVA层增加native接口类
package com.example;

/**
* Created by LinChengChun on 2018/1/2.
*/

public class XXXX{

    public native static int test();     // 在外部可以通过 XXXX.test() 方法调用

    static {
        System.loadLibrary("nativeXXXX");  // 优先加载动态库
    }
}
3、添加NDK编译工具,AndroidStudio中添加 外部编译命令 的方法

在Settings > Tools > External Tools中添加命令行工具(NDK)如下: ndk-build、ndk build clean、javah
这里写图片描述
这里写图片描述
这里写图片描述
如果顺利完成以上步骤,就可以在工程任意位置 右键->NDK->ndk-build 编译生成 so库了

三、在JNI读取系统属性方法

用 objdump 看了一下 libc.so ,找到了其中的函数。如下:

000095f0 g    F .text  00000014 __system_properties_init  
00009604 g    F .text  00000014 __system_property_find  
00009618 g    F .text  00000014 __system_property_find_nth  
0000962c g    F .text  00000014 __system_property_get  
00009640 g    F .text  00000014 __system_property_read  
00009654 g    F .text  00000014 __system_property_wait 

头文件是 system_properties.h ,在 usr/include/sys目录下面。
__system_property_get 可以用来获取一个属性值,函数原型如下:

/* Look up a system property by name, copying its value and a 
** \0 terminator to the provided pointer.  The total bytes 
** copied will be no greater than PROP_VALUE_MAX.  Returns 
** the string length of the value.  A property that is not 
** defined is identical to a property with a length 0 value. 
*/  
int __system_property_get(const char *name, char *value);  

读写ro.build.id的方法

    char *key = "ro.build.id";
    char value[PROP_VALUE_MAX] = {0};
    int ret = __system_property_get(key, value);
    if(ret <= 0 ){
        return -1;
    }

四、在JAVA中读取系统属性方法

    private static String getSystemProperty(String key, String defaultValue) {
        try {
            Class<?> clz = Class.forName("android.os.SystemProperties"); // 通过反射实现
            Method get = clz.getMethod("get", String.class, String.class);
            return (String)get.invoke(clz, key, defaultValue);
        } catch (Exception e) {
        }
        return defaultValue;
    }

    public static  boolean test(){
        String value =CurrentClass.getSystemProperty("ro.build.id", null);
        if (TextUtils.isEmpty(value)){ 
            return false;
        }
        if(!"XXXX".equals(value)){
            return false;
        }

        return true;
    }

五、把编译生成的so库打包到apk里面去

android {
    compileSdkVersion 23
    buildToolsVersion '25.0.0'

    defaultConfig {
     。。。。。。

        ndk {
            abiFilters 'armeabi-v7a', 'x86'
        }

        //加载so库目录
        sourceSets {
            main {
                // Tell Android Gradle that no jni code need to compile, so we can avoid Ndk compile task,
                // then we will to compile use ndk-build in command-line.
                jni.srcDirs = []    // 不依赖 gradle来编译 jni,根据我们的ndk-build来编译
                jniLibs.srcDir "src/main/libs"
            }
        }
    }
    。。。。。。

六、以上是APP 添加 jni 代码的全部记录,注意下包名,一般可以启动运行正常,jni基础知识会在另外文章介绍。^-^

安卓C++游戏引擎核心模块构建:JNI通信、游戏循环与OpenGL ES渲染实践 在移动游戏开发领域,跨平台游戏引擎是连接底层硬件与上层游戏逻辑的关键中间件。其核心原理在于通过抽象层封装不同操作系统的原生API,为游戏提供统一的开发接口。这种架构的技术价值在于实现了高性能与跨平台兼容性的平衡,尤其适用于对图形渲染和实时交互要求苛刻的游戏应用场景。本文聚焦于安卓平台,深入探讨了如何利用JNI(Java Native Interface)构建高效的C++/Java通信桥梁,并详细阐述了游戏循环(Game Loop)的设计哲学与DeltaTime机制,以确保帧率稳定。通过封装OpenGL ES 阅读详情

相关推荐

Unity调用Android原生设置界面:从JNI原理到实战封装

在移动应用开发中,跨平台引擎与原生系统的交互是扩展功能边界的关键技术。其核心原理通常基于JNI(Java Native Interface)或类似的桥接机制,允许托管代码(如C#)调用原生代码(如Java/Kotlin),从而访问操作系统提供的丰富API。这项技术的核心价值在于,它能突破引擎自身的限制,实现深度系统集成,例如管理硬件权限、调用特定设备功能或嵌入第三方SDK的原生界面。在游戏开发,尤其是使用Unity引擎的Android项目中,一个典型的应用场景就是需要调起系统级的设置页面(如网络、声音、应用

weixin_30859423的博客 593

JNI读取系统属性

1、添加头文件 #include <sys/system_properties.h> 2、使用 char value[PROP_VALUE_MAX] = {0}; int ret = __system_property_get(“ro.product.”, value);

qq_27256793的博客 1210

Cocos Creator安卓隐私弹窗实现:原生层拦截与合规上架指南

在移动应用开发中,隐私合规是产品上架的关键环节,尤其涉及用户数据收集时,必须遵循明确的告知与同意原则。其技术原理在于,应用启动流程需在收集任何信息前,通过原生层(如Android的Activity)进行拦截,实现用户授权确认。这一机制的技术价值在于保障应用符合全球各大应用商店的审核规范,避免因违规导致下架风险。典型应用场景包括集成广告SDK、数据分析工具或获取设备信息时,必须在初始化前获得用户明确许可。本文聚焦于Cocos Creator游戏引擎,详细解析如何通过构建模板、Activity跳转控制及Shar

weixin_34032792的博客 469

Andoid - 设置和获取系统属性

上面adb命令设置的方法重启手机后之前设置的参数就会失效,有些在开机过程就要读取的参数就无法调试。这时候就可以直接修改本地文件进行调试。

cheriyou_的博客 1163

Frida实战:绕过安卓APP抓包检测的5种核心姿势

在移动应用安全测试与协议分析中,抓包是获取网络通信数据、分析业务逻辑的关键技术手段。其原理是通过代理服务器或中间人(MITM)技术,拦截并解密应用与服务器之间的HTTP/HTTPS流量。然而,随着安全意识的提升,许多应用会集成代理检测、SSL证书绑定(SSL Pinning)等防护机制,导致传统抓包工具失效,这为安全测试和逆向分析带来了挑战。Frida作为一个动态代码插桩框架,其技术价值在于能够在不修改应用安装包的情况下,实时Hook(挂钩)并修改应用在运行时的内存与逻辑,从而绕过这些防护。通过Hook系统

weixin_34293911的博客 453

Unidbg模拟执行安卓Native与Java层代码,绕过环境检测实战指南

在移动安全与逆向工程领域,环境检测是应用常见的防护手段,旨在识别和阻止代码在非授权或调试环境中运行。其原理通常是通过检查系统属性、文件路径、进程模块及硬件特征等维度来判定运行环境是否可信。为了应对这一挑战,模拟执行技术应运而生,它能在隔离的虚拟环境中动态运行目标代码,从而在不触动真实系统的情况下进行分析与测试。Unidbg作为一款基于Unicorn引擎的高阶模拟工具,其技术价值在于能够同时模拟执行Android的本地库(so文件)和Java层代码,无需依赖完整的Android系统,为安全研究人员提供了高度可

diaoju3333的博客 348

Android读取系统属性详解

Android 系统属性主要有两种:SettingsProvider 和 SystemProperties。

allen_xu_2012_new的博客 3477

安卓Imgui Mod管理器开发:C#与Java跨平台GUI解决方案

即时模式GUI(Immediate Mode GUI)是一种高效的图形界面编程范式,其核心原理在于每帧完全重建界面,简化了状态管理并提升了渲染性能。在移动开发领域,这种技术价值尤为突出,能够为性能敏感型应用提供流畅的交互体验。Dear Imgui作为其知名实现,常被用于游戏开发工具和调试界面。将此类高性能GUI库与安卓平台结合,面临的主要挑战在于如何跨语言集成系统API并适配移动端触控交互。本项目通过C#与Java技术栈的协同,构建了一个面向安卓设备的Mod管理器框架,为游戏模组管理和应用配置提供了触控友好

weixin_30512089的博客 365

Android 读取系统属性详解

关于Android"设置"里的一些属性可以直接通过settings命令直接查看或者设置。shell 下 settings指令可以分别查看系统、全局、安全设置属性。

Jimmy的专栏 6147

告别手动写脚本!用Frida-Trace一键Hook安卓JNI函数(附实战APK)

本文详细介绍了如何使用Frida-Trace工具自动化Hook安卓JNI函数,告别传统手动编写脚本的复杂流程。通过实战案例演示,读者可以快速掌握如何定位JNI函数、动态生成Hook脚本以及实时监控函数调用,显著提升逆向工程效率。特别适合Android安全研究人员和逆向工程师。

weixin_29323551的博客 221

芯片级IO (Pad) Ring &IP Checklist

芯片级IO Ring,PAD Ring 和IP Checklist检查项目

weixin_37584728的博客 3571

类型 jni_java和C++联姻:JNI常用代码模板

Java的应用广,C++性能强,JNI就是两者连接的桥梁。一个安卓应用,做交互肯定是java,但是底层的音视频处理、机器学习,就必须要靠C++这个强悍的发动机。本文我们就一起做个改装,给java装个好发动机。1. 在C++中读取和创建java Stringextern "C" JNIEXPORT jstring JNICALL Java_com_example_myapplication_JniR...

weixin_39928768的博客 210

LangGraph实战:用Python异步构建智能客服多轮对话系统(附完整代码)

本文详细介绍了如何使用LangGraph框架和Python异步编程构建一个高性能的智能客服多轮对话系统。通过将对话流程建模为有向图,结合thread_id实现多用户对话隔离,并利用异步节点提升系统并发处理能力,有效解决了传统客服系统上下文遗忘与高并发瓶颈问题。文章提供了从环境搭建、状态管理、异步优化到复杂业务逻辑与部署的完整实战代码。

weixin_29055137的博客 149

Android NDK开发——Android studio使用JNI调用OpenCV处理图像

在安卓里面使用OpenCV图像处理库,JNI调用C++示例

知来者逆的博客 8225

【学习笔记】计算机网络 第八章 无线局域网(WLAN)

计算机网络 第八章 无线局域网(WLAN)

Vera_shsf的博客 1243

如何搭建pikachu靶场

Pikachu靶场本地搭建指南 下载安装PHPStudy并启动Apache/MySQL服务 获取Pikachu靶场源码并解压到网站根目录 配置数据库连接信息(修改config.inc.php文件) 创建pikachu数据库(用户名/密码设为root) 访问http://localhost/pikachu测试功能 常见问题:数据库连接失败需检查服务状态和配置信息,页面报错需检查PHP版本兼容性。建议使用PHP7.3/7.4版本,在隔离环境中搭建使用。 (150字)

2401_85351702的博客 1276

Unity与Android原生交互实战:从JNI原理到系统相册调用

在移动应用开发中,跨平台引擎与原生系统的交互是实现深度功能定制的关键技术。其核心原理基于Java Native Interface,它作为桥梁,允许不同编程语言环境间的相互调用。Unity引擎在此基础上封装了AndroidJavaClass与AndroidJavaObject等类,极大简化了C#与Java/Kotlin代码的互操作流程。这项技术的核心价值在于,它使开发者能够突破引擎自身的功能限制,直接调用Android系统API或第三方SDK,从而集成如系统相册、NFC、支付等原生功能,实现更丰富的用户体验

weixin_30800807的博客 453

NAT反向代理技术的实现(外网访问内网)

NAT反向代理技术的实现(外网访问内网)(版权所有,引用 请联系作者,注明出处) NAT技术是网络中的重要应用之一。当有一个场景:内网搭建了服务器,需要外网访问时,可以借助NAT映射来实现。如:单位建立了一个Web服务器,我们希望在员工回家之后,依然可以访问到它,那怎么实现呢? 下面的拓扑图,就用来示范这个应用反面场景的实现过程。 一、题目要求: 地址配置如图。使用静态路由: 1、配置右侧交换机2950T,实现单臂路由; 2、配置路由使网络连通; 3、配置NAT访问,实现外网对风网服务器的

joyousmime的博客 8487

Android JNI中jfloatArray与jfloat*的相互转换

本人近期在写JNI时,本地native传入的数据类型是float[] xx,对应的jni的参数类型即为jfloatArray xx,那么如何读取jfloatArray xx中的数据呢,具体详见本人的实践代码部分“jfloatArray转vector<float>”。 同时在JNI中本人花还遇到需要将std::vector<float>类型的数据转为jfloatArray类型后作为返回值返回。该部分的实现详见本人实践代码部分“vector<f...

zhw864680355的博客 5997

Ego Planner规划算法(上)——Ego Planner流程介绍

本系列文章用于学习记录Ego-Planner规划算法的相关内容,本系列文章是在在Fast Planner规划算法系列文章的基础上,展开对Ego Planner的相关介绍,主要包括Ego Planner算法流程和程序框架两部分,主要学习资料是深蓝学院的移动机器人运动规划课程

慕羽★的博客 1万+

RKNN 端侧部署必看:YOLOv11 Pose 姿态估计模型转换与性能优化实战

随着人工智能技术在边缘计算领域的快速发展,姿态估计作为计算机视觉的重要分支,在智能监控、人机交互、体感游戏等场景中展现出巨大的应用潜力。本文深入研究了YOLOv11 Pose模型在Rockchip RKNN平台上的部署方案,从理论基础、模型转换、平台优化到实际部署进行了全面阐述。通过详细的技术分析和实验验证,证明了RKNN平台能够有效提升YOLOv11 Pose的推理性能,在RK3588硬件平台上实现了高达100 FPS的实时姿态检测,为边缘计算场景下的姿态估计应用提供了高效的解决方案。

m0_71589036的博客 183

Android NDK与JNI开发实战:从零构建Java与C++的桥梁

在移动应用开发中,性能优化和代码复用是核心挑战。Java Native Interface(JNI)作为Java平台的标准编程接口,定义了Java虚拟机与原生代码(C/C++)之间的交互协议,是实现跨语言调用的关键技术。其原理是通过严格的函数命名规则和数据类型映射,在Java层声明native方法,在Native层实现对应函数,最终编译为动态链接库(.so文件)。这项技术的价值在于能够直接利用操作系统底层能力,显著提升计算密集型任务(如图像处理、音视频编解码)的执行效率,同时复用大量成熟的C/C++生态库。

weixin_33894640的博客 369

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

安卓NDK下读取文件

这几天一直在弄模板生成算法移植到手机GPU上。

wcj0626的专栏 1847

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android音视频开发:FFmpeg集成与JNI调用实战指南

音视频编解码是多媒体应用开发的核心技术,它涉及将原始音视频数据转换为特定格式进行存储或传输。其原理基于编码算法对数据进行压缩,解码则进行还原。在移动开发领域,Android系统虽然提供了MediaCodec等硬件加速方案,但在处理非标准格式、复杂滤镜或需要跨平台一致性的场景时,原生API往往能力有限。此时,集成功能强大的开源库成为关键解决方案,能够为应用带来专业级的处理能力和广泛的格式兼容性。FFmpeg作为业界公认的“瑞士军刀”,通过其libavcodec、libavformat等核心库,为开发者提供了从

weixin_34038293的博客 474

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android studio JNI NDK 开发(opencv,opencl 调用等等,更新中)

转载请注明 cwyf 身为FAE一直处于什么都要干的情况,开发和客户端支持,一直在做(看着那可怜的薪水心疼).最近做的工作点有点多,所以来写个博记录下一些关键点.自从加入sunny后作了2年的PC端MFC,C# winform,现在开始在领导要求下转行,做数据库,服务器搭建,还有开始尝试Qualcomm底层开发+上层Android JAVA APK应用开发,主要负责camera相机相关和图像算法

weixin_41088228的博客 1981
上一篇: 个人技术发展方向
下一篇: librtmp开源库与android平台编译记录
艾特小王子
博客等级 码龄10年 6粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值