Android JNI之动态创建native

Unity与Android混合开发实战:从通信原理到IL2CPP优化全解析 移动应用开发中,跨平台框架与原生平台的混合开发模式是提升应用功能深度与性能表现的关键技术。其核心原理在于通过JNI(Java Native Interface)等桥接技术,实现C#与Java/Kotlin代码间的双向通信与数据交换,从而在保持跨平台开发效率的同时,能够深度调用Android系统原生API与硬件能力。这项技术的核心价值在于解决了单一框架的功能局限,使开发者能够灵活集成支付、广告、传感器等原生SDK,或是在原生App中嵌入高性能的3D渲染模块。典型的应用场景包括游戏内嵌原生功能、教育应用结合3D 阅读详情

                                          Android JNI之动态创建native

1、环境配置

      1)确定android studio里安装了ndk,可以按照下面的图查看。

 2)系统环境变量配置,根据自己电脑路径配置

                            

                                       

2、动态创建native

    1)新建一个android studio工程,然后在gradle.properties里增加如下语句。

     

   2)在MainActivity平级目录下新建一java文件,内容如下:

package com.example.myjnidemotest2;

public class JniUtils {
    static{
        System.loadLibrary("native-lib");
    }
    public static native String getStringFromJni();
    public static native int getAddResultFromJni(int a, int b);
}

  3) 在main下面新建jni目录

4)在jni目录下新建三个文件,一个cpp文件,两个mk文件。 cpp文件是实现具体功能的,是用C++实现的。

     cpp文件内容

#include <jni.h>
#include <stdio.h>
#include<android/log.h>
#include <stdlib.h>

using namespace std;
#ifdef __cplusplus
extern "C" {
#endif

static const char *className = "com/example/myjnidemotest2/JniUtils";

JNIEXPORT jstring JNICALL JniSay(JNIEnv *env, jobject obj) {
    return env->NewStringUTF("Hello From JNI!!!");
}

JNIEXPORT jint JNICALL addInJni(JNIEnv *env, jobject obj, jint a, jint b) {
    return a + b;
}

static JNINativeMethod gJni_Methods_table[] = {
        {"getStringFromJni", "()Ljava/lang/String;", (void*)JniSay},
        {"getAddResultFromJni", "(II)I", (void*)addInJni},
};

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){
    JNIEnv* env = NULL;
    jint result = -1;
    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        return result;
    }

    jclass clazz = (env)->FindClass( className);
    if (clazz == NULL){
        return -1;
    }

    if ((env)->RegisterNatives(clazz, gJni_Methods_table, sizeof(gJni_Methods_table) / sizeof(gJni_Methods_table[0])) < 0)
    {
        return -1;
    }

    return JNI_VERSION_1_4;
}

#ifdef __cplusplus
}
#endif

    Android.mk文件内容

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := native-lib
LOCAL_SRC_FILES := ImplementFuns.cpp
include $(BUILD_SHARED_LIBRARY)

    Application.mk文件内容

APP_ABI := all

5)在app的build.gradle里增加如下内容

6)调用JNI接口,我是在MainActivity里调用的。

package com.example.myjnidemotest2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("wujiang", "from jni str = " + JniUtils.getStringFromJni());
        Log.d("wujiang", "a + b = " + JniUtils.getAddResultFromJni(4, 9));
    }
}

7)编译运行就ok了,我的运行结果

                                                      THE    END

unidbg教程 典型案例代读二 本文介绍了使用Unidbg框架模拟安居客App签名过程的代码实现。通过构建32位Android模拟器环境,加载目标so库libsignutil.so,并解析Java类SignUtil,实现了对native方法getSign0的调用。代码展示了如何初始化Unidbg环境、处理参数转换、调用JNI方法以及资源释放等关键步骤。测试用例演示了输入参数的处理和签名结果的获取过程,为逆向分析移动应用签名算法提供了参考实现。 阅读详情

相关推荐

Android安全攻防:基于Inline Hook的Frida检测与绕过实战

在移动应用安全领域,动态插桩技术是进行运行时分析和漏洞挖掘的重要手段。其核心原理是通过注入代码或修改内存指令,实现对目标进程行为的监控与干预。这项技术在安全评估、逆向工程和自动化测试中具有极高的技术价值,尤其在Android平台,被广泛应用于应用行为分析、协议解密和漏洞验证等场景。然而,随着安全对抗升级,针对动态插桩工具的检测与防护机制也日益增强。本文聚焦于基于Inline Hook的实战攻防,深入探讨如何通过直接修改内存指令来检测Frida等工具的注入痕迹,并详细解析相应的绕过策略。文章将结合ARM/AR

weixin_34082854的博客 351

Android NDK开发

文章目录Android NDK 开发环境依赖NDK 开发 Android NDK 开发 NDK 开发其实就是在Android开发中使用C++这种底层开发语言。 环境依赖 Android Studio 在Android Studio里使用SDK Manager安装sdk和ndk(建议r16版本) NDK 开发 在Android Studio中新建工程,选择Native C++工程 选择这个模板...

Terie的博客 1323

Frida动态追踪:穿透Android代码混淆,精准Hook核心函数实战

在移动安全与逆向工程领域,动态分析是理解应用行为的关键技术。其核心原理在于通过运行时注入,拦截和修改程序执行流程,从而在不依赖源代码的情况下分析逻辑、调试或测试应用。这项技术的核心价值在于能够穿透代码混淆、加密等保护措施,直接观察应用的真实行为。在Android平台,Frida作为主流的动态插桩框架,通过JavaScript脚本与目标进程交互,为安全研究员和开发者提供了强大的运行时分析能力。典型的应用场景包括分析混淆后的登录验证算法、定位加密函数、追踪网络请求数据流等。本文以Android应用安全分析为背景

ciya3282的博客 316

Android中JNI&NDK入门(四) 之 使用CMake方式编译NDK

1 前言 我们在前面几篇文章中对JNK/NDK做了一个入门的介绍,其中使用了Android.mk和Application.mk本地配置的方式进行NDK开发。但是其实在Android Studio 2.2之后便加入了CMake方式来编译NDK代码。 2 CMake CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或...

子云心的博客 2359

NACA0012的O型网格求解

本篇文章采用偏微分方程数值解法生成NACA0012翼型O型网格,并采用速度势方程求解绕NACA0012翼型迎角为0度时的低速不可压无粘流场。 文章目录一、求解网格1.翼型2.远场3.网格4.迭代5.求解二、求解流场1.偏微分方程2.迭代求解流场三、求解参数1.偏微分方程2.迭代求解四、导出数据 一、求解网格 1.翼型 本次求解网格和流场等采用的是NACA0012(修形)对称翼型,在NACA四位翼型中,第一位数字代表的是弯度,第二位数字代表的是弯度位置,后两位数字代表的是厚度,由于本次翼型的前两位数字都为0,

m0_50746433的博客 6677

【电路设计】带阻滤波器实战:从理论到Twin-T陷波电路实现

本文详细介绍了带阻滤波器的原理与Twin-T陷波电路的实战应用,从基础概念到工程实现全面解析。通过具体案例展示如何设计高Q值滤波器,解决电源噪声等实际问题,并分享PCB布局和元件选型的实用技巧,助力工程师提升电路设计能力。

gg901的博客 1011

Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库

NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。就会生成两个文件这几个so文件,如下图一,然后就能正常获取到C++文件(也就是cpp文件)中的数据了,还可以把so动态库提供给第三方使用,具体方式详见。在android的JNI中,要先将相应的C/C++打包成so库,然后导入到lib文件夹中供java调用。(5)安卓中的so文件是什么?

UrasakiNakajima的博客 8428

ctfshow---sql注入(171-213)

这里提一句,为什么不直接替换成acb这种,因为,flag原本就有字母,还原的时候会全部都还原成数字的,数字替换成符号应该也是可以的,这边测试了下除了&#好像别的符号都可以。插入查询后查询语句就会变成这样,由于id=11111这是一个不存在的id,而后面1=1又为真,所以会查询到表内所有的内容,--+是注释后面的字符。因为接受username的时候没有用引号,所以接受单纯的数字,而数字和字符比较会转换类型,字符串会变成数字0进行比较,所以相等。

fainpo的博客 1320

使用GDB调试Android Native Lib

最近我的安卓项目中,native模块都是在linux环境下编译成so后再放到android studio工程中使用的,网上常见的gdb/ndk-gdb教程并不完全适用于我们项目,所以我总结了一份文档,供大家参考使用。 1.环境准备 主机环境:ubuntu 18.04 in virtualBox 安卓平台:android 7.0 手机 android NDK: r14b **注意:**andro...

bingoCoder的博客 850

语言 拉丁超立方抽样_医学统计与R语言:间断时间序列分析(Interrupted time series regression)...

微信公众号:医学统计与R语言如果你觉得对你有帮助,欢迎转发Interrupted time series (ITS) analysis is a valuable study design for evaluating the effectiveness of population-level health interventions that have been implemented...

weixin_29300805的博客 3706

基于扩展卡尔曼滤波(EKF)结合到达时间(TDOA)、到达频率(FDOA)实现多无人机无源定位,MATLAB代码

该程序实现了一种结合到达时间差(TDOA)和到达频率差(FDOA)技术的多无人机定位方法,利用扩展卡尔曼滤波(EKF)对单一目标进行定位。程序通过模拟多无人机的运动及其与目标的相对位置,估计目标的状态(位置和速度)。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 1266

jni打怪第一篇--Android jni开发

学习下 jni 开发。 确保 AS 已经安装了相关的 SDK 工具,主要是 LLDB 、NDK 、CMAKE 1.新建一个jni工程 新建一个 jni 工程,选择 Native C++ , 新建完成。 看看默认生成的工程的都有什么东西。 1.1 主页面MainActivity public class MainActivity extends AppCompatActivity { // Used to load the 'native-lib' library on application

weixin_44021334的博客 524

【电子元件篇】电容的九大作用与选型指南-超简单解读

本文系统介绍了电容的基础概念、核心功能及实际应用。电容作为存储电荷的被动元件,其容值公式为C=Q/V,单位包括法拉及常用派生单位。文章重点解析了电容的九大功能:滤波(通过RC低通电路抑制噪声)、耦合(传递交流隔离直流)、去耦(稳定供电)、储能(短暂供电)、定时(RC延时)、谐振(RLC振荡)、旁路(高频通路)、电压调节(DC-DC转换)以及保护(吸收浪涌)。同时详细阐述了电容分类(陶瓷/电解/薄膜等)、参数选型要点(耐压/容值/精度/温度)及PCB设计注意事项,并针对不同应用场景提供了具体选型建议和常见误区

2301_81299416的博客 4011

Android中利用JNI在本地函数中生成Java层的对象

继续上面的文章学习,在本地函数中,不但可以获取到Java层上的字段值 函数方法,对字段值操作,调用Java层方法,还可以在本地函数中新建成Java层的对象。             jclass rvClazz =(*env)->FindClass(env,"com/example/adder/ResultValue");   //找到该类文件      jmethodID cons

进击中的Park哥 448

数字IC后端实现 | Innovus各个阶段常用命令汇总

数字IC后端设计实现之Innovus常用命令汇总

weixin_37584728的博客 7323

【教程4>第6章>第26节】基于FPGA的MMSE信道估计与均衡系统实现与整体测试,并对比LS信道估计

通过前面几个章节的学习,我们完成了MMSE信道估计和均衡系统。为了进一步验证MMSE信道估计的性能,我们在系统的最后,增加一个信道估计误差计算程序。由于MMSE信道估计,其主要优势在SNR较小时提现,因此测试对比时,我们在testbench中,将SNR设置为2db。然后m值,我们不考虑一个固定值,而是一直累加,直到所设置的仿真时间结束。通过对比可以看到,MMSE信道估计性能优于LS信道估计。这样方便FPGA中的误差计算。

FPGA/MATLAB学习教程/源码/项目合作开发 1600

Android JNI学习08-AndroidStudio3.6 在JNI中创建java的实体类

链接:https://pan.baidu.com/s/1zB9r5WwuTMIPNMlYl5HlvA 提取码:5ndl 先创建实体类Bean public class Bean { public String info; public Bean(String info){ this.info = info; } public void jniCall(){ System.out.println(info); } } 创建.

u010632547的博客 350

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Android JNI - 1】C语言基础复习

JNI基础一、结构体指针二、内存分配1. 静态内存分配2. 动态内存分配三、动态创建数组 JNI (Java Native Interface): Android 通过JNI 可以让Java 调用C/C++代码,还可以让C/C++代码调用Java代码。 在学习JNI前,先看一些有点难度的C语言: 一、结构体指针 #include <stdio.h> #include <std...

|~~~热爱生活、努力学习的小伙汁~~~| 721

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android sudio jni 调用so_java中通过JNA调用dll

1. JNA简单介绍先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即可。首先看下JNI调用C/C++的过程,注意写程序时自下而上,调用时自上而下。可见步骤非常的多,很麻烦,使用JNI调用.dll/.so共享库都能体会到这个痛苦的过程。如果已有一个编译好的.dl...

weixin_39953100的博客 443

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android动态创建arraylist,使用Android本机代码创建arraylist

如果这是一个重复的问题,请告诉我,不要downvote,我是Android-native开发的新手.我想通过使用Android本机代码创建一个ArrayList,我尝试了以下内容:#include #include #include templateextern "C"{ //here it is showing **error expected unqualified-id before st...

weixin_39754142的博客 263

JNI程序编写与简单分析

环境准备: 建立JNI项目: 上图中的Toolchain工具集就是由NDK包提供的一部分类,所以NDK是必须要安装的。 默认即可。如果上面的环境准备没有做的话,直接新建jni项目也是会有Gradle提示你安装的。 生成目录如下: 大致分析demo: MainActivity做的第一件事:将要用的c++库先导入进来,这样我们才能调用这个库里面的c++方法.如果这个库不...

手写我对你的温柔 461

JNI技术之C++层玩转Java层的对象

本文介绍了JNI中数组操作的方法。代码演示了如何在C++层处理Java传递的数组参数,包括基本数据类型数组和引用类型数组。通过JNIEnv提供的函数,如GetIntArrayElements()和GetObjectArrayElement(),可以获取Java数组并在C++层进行操作。同时还展示了数组元素的修改、释放以及日志打印等操作。对应的Java层代码通过native方法声明和按钮点击事件触发JNI调用,实现了Java与C++之间的数组数据交互。

ChenYiRan123456的博客 68

android 下编程,windows下小试Android NDK编程

1.Eclipse不要用google集成版,否则不能设置NDK路径,BTW:这里卡了我很久,后来问同事才知道的!!2.装好ADT、CDT插件3.windows-->preferences-->Android-->NDK(插件没装好的话不会出现此菜单),设置NDK路径 如:D:\android-ndk-r9d4.OK,现在新建一个 test的安卓工程,所有设置都默认5.在test...

weixin_29227585的博客 131

嵌入式Linux驱动开发实战:从字符设备到安卓HAL全链路

设备树作为硬件描述与内核驱动解耦的关键机制,让同一份驱动代码可适配不同板卡,是嵌入式Linux工程实践中的核心概念。其原理是通过compatible属性实现设备节点与平台驱动的自动匹配,而字符设备框架则提供了用户空间访问硬件的统一接口。理解这两者的协作关系,是解决I2C、SPI等外设驱动移植问题的技术基础。在安卓体系下,从内核驱动到HAL再到JNI的全链路贯通,还涉及并发控制、中断管理和稳定性排查等工程难点。以真实项目路线,拆解从设备树配置、平台驱动编写到安卓侧联调的全过程,为驱动开发面试中的高频追问提供可

weixin_34174422的博客 177

2021-01-15

Android:JNI之Java和C层的相互调用及多线程的回调实现 一、前言   Java本机接口(Java Native Interface (JNI))是本机编程接口,它是JDK的一部分,JNI它提供了若干的API,实现了和Java和其他通信(主要是C&C++),用于从Java程序调用C/C++,以及从C/C++程序调用Java代码。   本文旨在强化JNI的使用技巧,简单的使用可另外参考https://www.cnblogs.com/blogs-of-lxl/p/9268732.html.

memechashang的专栏 258

Frida主动调用实战:从Hook到操控的五大核心场景解析

在移动安全与逆向工程领域,动态插桩技术是实现应用行为分析和漏洞挖掘的关键手段。其核心原理是通过注入代码到目标进程,实现对运行时函数调用的拦截与监控。这项技术的核心价值在于,它允许安全研究人员和开发者在不修改源码的情况下,动态观察、修改甚至创造应用的执行逻辑,从而极大地提升了安全测试、协议分析和算法验证的效率。在实际应用中,动态插桩技术广泛应用于移动应用安全评估、恶意软件分析、游戏外挂检测以及物联网设备固件分析等场景。本文聚焦于Frida工具中的**主动调用**技术,深入探讨如何超越传统的被动Hook,实现对

weixin_30411239的博客 407
上一篇: Android TV TIF源码阅读笔记
下一篇: Android高效的EPG界面实现方式
wujiang_android
博客等级 码龄9年 11粉丝 37原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值