android JNI 示例详解

安卓逆向_21 --- Java层和so层的反调试( IDA 动态调试 JNI_OnLoad、init_array下断) 1. 安卓程序动态调试条件 安卓程序动态调试条件 ( 2个满足1个即可 ): 1. 在 AndroidMainfest.xml ---> application 标签下,设置或者添加属性android:debuggable="true" 2. 系统默认模式,在 build.prop(boot.img),ro.debuggable=1 And... 阅读详情
android是使用java进行开发,但是在开发过程中可能会用到之前的c,c++代码,或者乳沟你想一套代码同时在iphone和android平台复用就会用到JNI啦。

JNI起的是一个桥梁的作用,可以转化java与c/c++的一些区别,比如数据类型等。之后我们将转换好的c代码生成动态链接库,供java调用。

下面以一个示例做说明,希望对刚接触的童鞋有所帮助。

1、安装NDK环境:这个可以参照我的前一篇文章“windows系统上安装与使用Android NDK r5”。这是一个童鞋写的,照着做就可以完全没有问题的安装好。

2、当你按照步骤1安装好环境后,比如安装在了D盘D:\android-ndk-r6,本文以下默认此路径,如果你的路径不同 做相应改变就好了。然后在D:\android-ndk-r6下新建apps文件夹,里面存放的就是你将来要搞的android jni 工程相关文件啦。

现在我在D:\android-ndk-r6\apps 下创建我的第一个工程目录Angry,注意这个Angry并不是你的android工程的根目录,在Angry下创建project文件,这下面存放的将是你的android工程。 以下是我的目录结构:

 

之所以这样是因为,大家可以看到在Angry下还有个Application.mk文件(下面讲这个文件的生成),这个文件里是我们将c/c++编译成动态链接库(.so)的时候需要使用到的配置信息。除这个文件外我们还会用到一个Android.mk文件,在下面会讲到。

3.好了,接下来就创建我们的android工程吧。创建Android工程,指定工程路径:D:\android-ndk-r6\apps\Angry\project,以下是我创建的工程:

              

创建好了之后就可以写我们的java接口了(相当于函数声明),真正的功能实现是要用c/c++实现的吆。你可以新建一个java文件,或者直接在你继承Activity的那个java中直接写,我是新建了一个Jni.java文件:

                                                               

Jni.java中的代码如下:
  1. <span style="font-family:Comic Sans MS;">package com.Angry;  
  2.   
  3. public class Jni {  
  4.     public native String getString ();  
  5. }  
  6. </span>  

注意接口要声明成native的吆。如果你不想单独放在一个文件中也可以直接放在MainAct.java中,将 public native String getString (); 放进去就好了。

4.生成头文件以及源文件:

将Jni.java复制到D:\android-ndk-r6\apps\Angry\project\bin下面,然后在D:\android-ndk-r6\apps\Angry\project\bin用“javac jni.java”编译生成Jni.class文件,将生成的Jni.class复制到 D:\android-ndk-r6\apps\Angry\project\bin\com\Angry下覆盖掉原先的Jni.class文件。

然后再在D:\android-ndk-r6\apps\Angry\project\bin(建个目录文件com/Angry目录,把class文件考进去)下使用命令 "javah -jni com.Angry.Jni" 这是将会在bin下生成一个com_Angry_Jni.h的头文件,大家可以看一下我的生成:、

  1. <span style="font-family:Comic Sans MS;color:#009900;">/* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class com_Angry_Jni */  
  4.   
  5. #ifndef _Included_com_Angry_Jni  
  6. #define _Included_com_Angry_Jni  
  7. #ifdef __cplusplus  
  8. extern "C" {  
  9. #endif  
  10. /* 
  11.  * Class:     com_Angry_Jni 
  12.  * Method:    getString 
  13.  * Signature: ()Ljava/lang/String; 
  14.  */  
  15. JNIEXPORT jstring JNICALL Java_com_Angry_Jni_getString  
  16.   (JNIEnv *, jobject);  
  17.   
  18. #ifdef __cplusplus  
  19. }  
  20. #endif  
  21. #endif</span>  

其实就是将我们原先Jni.java中的public native String getString ();函数声明形式做了些许改动,使之符合JNI规则。

之后我们要在D:\android-ndk-r6\apps\Angry\project下即Android工程下新建jni文件夹,将com_Angry_Jni.h文件放入其中。这个jni文件夹将是盛放我们c/c++源文件以及头文件和Android.mk文件的场所。

接下来就是实现我们的函数功能了:新建c/c++源文件:com_Angry_Jni.c(同样放在jni文件夹下):

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include "com_Angry_Jni.h"  
  4.   
  5. JNIEXPORT jstring JNICALL Java_com_Angry_Jni_getString  
  6.   (JNIEnv *env, jobject thiz) {  
  7.  return (*env)->NewStringUTF(env, "I,M ANGRY");  
  8. }  

像我就只是单纯的实现了返回一字符串的功能,具体功能大家可以自己添加。程序中的jstring 等数据类型其实jni对c/c++的数据类型做了形式的改变,jstring 就是String。

现在功能都实现好了,我们可以将上面的c代码编译成so文件供java调用(因为android是基于linux的,而linux的动态链接库文件是以.so为后缀,windows以.dll为后缀)。

5、编译生成.so文件需要两个.mk文件,就是我们上面提到的Application.mk文件和Android.mk,在D:\android-ndk-r6\apps\Angry\project\jni下创建Android.mk,内容如下:

  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE    := Angry  
  6. LOCAL_SRC_FILES := com_Angry_Jni.c  
  7.   
  8. include $(BUILD_SHARED_LIBRARY)  


LOCAL_PATH: 表示位于工程的根目录。

include $(CLEAR_VARS) 功能还不太清楚我。

LOCAL_MODULE := Angry 这个表明你的一个动态链接库的名字,所以你的链接库生成后会叫libAngry.so,libxxx.so是系统加的,xxx即此处的名字。

LOCAL_SRC_FILES := com_Angry_Jni.c 这是你要编译的源文件。

还有好多配置指令,有兴趣大家可以自己查。

然后再在D:\android-ndk-r6\apps\Angry 下创建Applicetion.mk文件:

  1. APP_PROJECT_PATH := $(call my-dir)/project  
  2. APP_MODULES := Angry  

APP_MODULES := Angry  指明了你的应用模块。

6、到此为止,我们都把准备工作做好了,接下来生成.so文件:

启动cygwin,进入NDK根目录:D:\android-ndk-r6,运行命令:make APP=Angry   如果显示:

                                                                                        

则表示.so生成并安装成功,你可以看到在 D:\android-ndk-r6\apps\Angry\project 下多了一个两层目录libs\armeabi\ 下面放着我们生成的libAngry.so。

7、到此为止,基本大功告成,下面我们验证一下c函数的功能能否实现:

在MainAct.java中实现如下简单代码:

  1. package com.Angry;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.TextView;  
  6.   
  7. public class MainAct extends Activity {  
  8.  private TextView tv;  
  9.     /** Called when the activity is first created. */  
  10.  static  
  11.  {  
  12.   System.loadLibrary("Angry");  
  13.  }  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.           
  19.         Jni jni = new Jni();  
  20.         tv = (TextView)findViewById(R.id.tv);  
  21.           
  22.         tv.setText(jni.getString());  
  23.     }  
  24. }  

运行下,看看效果:

Android Studio开发JNI示例 JNI和NDK介绍 JNI(Java Native Interface),是方便Java调用C、C++等Native代码所封装的一层接口,相当于一座桥梁。通过JNI可以操作一些Java无法完成的与系统相关的特性,尤其在图像和视频处理中大量用到。 NDK(Native Development Kit)是Google提供的一套工具,其中一个特性是提供了交叉编译,即C或者C++不是跨平台的,但通过N... 阅读详情

相关推荐

ANDROID JNI 底层原理详解

JNI(Java Native Interface)即 Java 本地接口,它允许 Java 代码与本地代码(如 C 和 C++)进行交互。在 Android 开发中,JNI 扮演着重要角色,它让 Java 代码(位于 Framework 层)能够调用 NATIVE 层的 C/C++ 代码,以实现高性能计算、访问底层硬件等功能。注册 JNI 方法:将 Java 方法与本地的 C/C++ 函数关联起来。Java 代码调用本地方法:在 Java 代码中调用声明为native的方法。JNI 层查找本地函数。

a5566255的专栏 1170

Android---简单的JNI实例

简单的JNI调用实例

格物致知的专栏 2317

MDK开发篇:基于立创逻辑派FPGA-G1与Cortex-M1软核的按键控制LED实战

本文详细介绍了基于立创逻辑派FPGA-G1开发板与高云Cortex-M1软核的完整开发流程。通过Gowin云源软件配置软核系统与GPIO外设,并在Keil MDK环境中编写按键控制LED的C程序,最终实现程序固化与上电自启动。教程涵盖硬件配置、软件开发、在线调试与固化部署全步骤,帮助STM32开发者快速上手FPGA软核开发。

weixin_42103128的博客 147

Android 使用 jni Demo示例

Android 使用JNI 基础流程

gvvbn的专栏 1764

CTF-Web习题:2019强网杯 UPLOAD

本题涉及知识点:代码审计、文件上传漏洞、反序列化漏洞

LJW123487的博客 1903

工程伦理-知识点汇总

工程伦理-知识点汇总

m0_46091747的博客 1万+

android JNI的使用示例详解

众所周知,android是使用java进行开发,但是在开发过程中可能会用到之前的c,c++代码,或者乳沟你想一套代码同时在iphone和android平台复用就会用到JNI啦。 JNI起的是一个桥梁的作用,可以转化java与c/c++的一些区别,比如数据类型等。之后我们将转换好

1555

Windows10环境下激活虚拟环境报错【source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称】

在使用Django创建Web程序前,需要创建一个虚拟的工作环境,在使用【source ll_env/bin/activate】命令激活虚拟环境时报错:source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。所在位置 行:1 字符: 2。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1万+

Android-JNI的简单使用

一、什么是JNI 1、jni的含义 JNI即为java native interface Java本地接口;JNI是用来调用本地方法的技术,用来使Java和C/C++进行通信。 简单来说,Java运行一个程序需要和不同的系统进行交互,在windows里就要和windows底层平台交互,mac里就要和mac的底层平台交互, JVM就是通过大量的JNI技术能够使Java运行在不同的系统平台当中,与不同的系统平台底层进行交互。 2、Java与JNI类型对照表 基本类型对照 引用类型对照 3、什么是动态库 静态

HZF 6568

Python爬取上市公司年报并进行财务比率分析:基于异步爬虫与数据挖掘的实战

在当今数据驱动的投资时代,获取并分析上市公司财务数据对于投资者、分析师和研究人员至关重要。中国证监会指定的上市公司信息披露网站——巨潮资讯网,包含了所有A股上市公司的年报、季报及其他公告信息。本项目将展示如何使用Python最新技术栈爬取巨潮网的年报数据,提取关键财务指标,并进行深入的财务比率分析。本文将采用异步爬虫技术提高数据采集效率,使用现代解析库处理PDF和HTML文档,并结合pandas进行数据分析和可视化。整个过程将遵循合规合法的爬虫伦理,尊重网站robots.txt协议,设置合理的请求间隔。

2201_76125261的博客 666

Sigrity Power Tree如何生成电源树操作指导

Sigrity Power Tree可以方便地生成电源树,仅需要网表文件就能将系统的电源树直观的显示出来,生成的电源树文件可以用Power DC,optimizePI进行直流和交流仿真,下面介绍如何生成电源树。Base on [Device_TYPE and VALUE]就是识别网表中器件的Device_TYPE作为power tree中的模型的名字。Allegro layout netlist file,就是从Allegro layout文件中输出的netlist第三方网表文件。如何生成电源树操作指导。

weixin_54787054的博客 1534

Android ——JNI基本了解与使用

JNI (Java Native Interface,Java本地接口)是一种编程框架,使得Java虚拟机中的Java程序可以调用本地应用/或库,也可以被其他程序调用。本地程序一般是用其它语言(C、C++或汇编语言等)编写的,并且被编译为基于本机硬件和操作系统的程序。Android NDK开发之JNI基础Android JNI详解JNI入门到精通: 用Java和C/C++打造高性能应用ANDROID STUDIO 创建一个JNI工程创建JNI基础工程并运行JNI基本知识(一)JNI编程原理。

qq_35231506的博客 2352

AUTOSAR从入门到精通-汽车电子电气架构(EEA)

EEA(Electrical/Electronic Architecture),电子电气架构,是首先由德尔福公司提出的,集合汽车的电子电气系统原理设计、中央电器盒的设计、连接器的设计、电子电气分配系统等设计为一体的整车电子电气解决方案的概念。通过EEA的设计,可将动力总成、驱动信息、娱乐信息等车身信息转化为实际的电源分配的物理布局、信号网络、数据网络、诊断、容错、能量管理等的电子电气解决方案。

getusushu的博客 858

android jni编程详解,Android Studio开发之 JNI 篇的简单示例

前言Android上层应用使用java开发,不过java并不适合密集型运算,比如图片处理等,遇到密集型运算,一般使用c/c++完成。Java虚拟机支持调用c/c++代码,即JNI(Java Native Interface),它提供了若干的API实现了Java和其他语言的通信。为方便android平台上使用JNI技术,提供了NDK开发包,可以将NDK理解为对JNI的进一步封装,方便开发使用罢了。J...

weixin_33733806的博客 589

【Py/Java/C++/C/JS/Go六种语言OD独家2024E卷真题】20天拿下华为OD笔试之【固定滑窗】2024E-考勤信息【欧弟算法】全网注释最详细分类最全的华为OD真题题解

可上练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【优快云】否则不通过)

weixin_48157259的博客 619

efm32 入门.pdf

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

JNI与Android NDK详解:原理、调用过程与实践示例

本文系统介绍了JNI(Java Native Interface)和Android NDK的核心概念与应用。JNI作为Java与本地代码(C/C++)的桥梁,主要用于代码保护、性能优化、复用现有库和系统级访问。文章详细解析了JNI调用流程,包括环境配置、接口设计、本地方法实现和构建配置,并提供了图像处理项目的实践示例。同时总结了内存管理、性能优化和调试技巧等常见问题解决方案,强调应合理使用这些技术以平衡性能与维护成本。通过JNI和NDK,开发者可以安全高效地集成本地代码,但需注意仅在必要时采用并确保规范开发

xingfuyisheng的专栏 1713

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android Studio开发之JNI简单示例

JNI:Java Native Interface,java本地开发接口。Java和C/C++的通信接口,是一个用来沟通Java和本地代码(C/C++)的协议。 编译环境:android studio 3.1.4,ndk17 1、JNI基础 1.1 使用JNI的好处   1.效率上 C/C++比java更高效; 2.代码移植,如果之前用C语言开发过模块,可以复用已经存在的c代码; 3....

若尘风 716

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

JNI 实战全面解析

简介 项目决定移植一款C++开源项目到Android平台,开始对JNI深入研究。 JNI是什么? JNI(Java Native Interface)意为JAVA本地调用,它允许Java代码和其他语言写的代码进行交互,简单的说,一种在Java虚拟机控制下执行代码的标准机制。 NDK是什么? Android NDK(Native Development Kit )是一套工具集合,允许你用像...

善于模仿,乐于接受 221

Android调用JNI全面解析

本文通过《Pro Android Games 2nd Edition》提供的示例,详细描述Android调用JNI的全过程。 1. MainAcivity中调用Natives中的native方法LibMain。 String[] argv = {"MyLib", "arg1", "arg2"}; Natives.LibMain(argv); 2. Natives类代码如下: package

lsj 952

android Jni 调试d

最近在搞 安卓 串口项目的时候,需要 把官网的 Serial Port API sample 项目 整合我的项目中,,所 以必须 要用 jni 先写了一个 jni  的 HelloWorld 小程序,练练手 还是老套路,先建立新项目  //加载库文件  System.loadLibrary("HelloWorldJni"); //声明原生函数 参数为String类型 返

zhoulonglong5201314的专栏 381

jni直接转byte_Android在JNI中使用ByteBuffer的方法

本文实例讲述了Android在JNI中使用ByteBuffer的方法。分享给大家供大家参考。具体如下:一、ByteBuffer 定义在NIO中,数据的读写操作始终是与缓冲区相关联的(读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区)缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型。ByteBuffer是最常用的缓冲区,它提供了读写...

weixin_39834780的博客 1460

Android NDK——必知必会之JNI的C++操作函数详解和动态注册小结(三)

引言 上一篇讲解了一些关于JNI和NDK的必知必会的理论知识和机制,由于篇幅问题把关于JNI的重要的函数放到这篇,具体使用留到下一篇,此系列文章基链接: Android NDK——NDK开发必知必会之JNI和NDK全面详解(一) Android NDK——NDK开发必知必会之JNI的操作函数详解和小结(二) 一、JNI中的函数概述 在JNI层我们基本上都是通过env指针来调用jni.h...

最美不过,心中有梦,身旁有你! 2079

Android Studio C++/JNI/Kotlin 示例 一

创建一个名为Learn1项目(Android Studio)。build.gradle.kts(:app) settings.gradle.kts(Learn1) 三、创建 CMakeLists.txt Android NDK(Native Development Kit)允许你在 Android 应用中使用 C/C++ 代码,通常用于高性能计算、游戏引擎、音视频处理等场景。NDK 项目的核心是通过 或 (较旧)来配置本地代码的编译。以下是详细的配置示例和解析:假设你有一个 JNI 模块,

qq_46279058的博客 1248

Android之——JNI初探

这里,我将用一个小例子的形式来帮助大家初探JNI的用法,首先,大家要先搭建好NDK环境,请大家先阅读《Android之——NDK环境搭建》一文。 一、实现 这个小例子实现的功能就是,通过Android中的java代码来调用C代码实现java代码与C代码之间的交互。 1、布局文件 我们首先在布局文件activity_main.xml中,添加一个按钮控件,并给按钮控件设置一个点击事件,具体代码

冰河的专栏 2385

Android JNI详解

Android使用JNI的原理解析

疯过无痕的博客 8504

Android之JNI详解

JNI(Java Native Interface) 是 Java 提供的一种编程框架,用于在 Java 应用程序中调用和与用其他编程语言(如 C、C++ 等)编写的本地代码(Native Code)进行交互。它允许 Java 程序访问操作系统或硬件提供的底层功能。

weixin_39788742的博客 1330
上一篇: Android 调试工具 DDMS的使用
下一篇: Android 中的AIDL
xing...
博客等级 码龄17年 30粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值