Android JNI开发入门之一

【Android JNI 开发入门指南】 交叉编译]在一个平台上去编译另一个平台上可以执行的本地代码。交叉编译的实现原理: 模拟不同平台的特性去编译代码。Android系统运行的 CPU 架构 :ARM,X86,mips[NDK (native Develop Kit),谷歌提供的: 用作JNI开发的交叉编译工具集。△安装介绍;如果电脑与JDK都是32位的则选择 android-ndk-r9d-windows-x86 的开发工具包。64为的则选择 android-ndk-r9d-windows-x86_64 的开发工具包。 阅读详情

JNI在Android系统中有着广泛的应用。Android系统底层都是C/C++实现的,上层提供的API都是Java的,Java通过JNI调用底层的实现。比如:Android API多媒体接口MediaPlayer类,其实底层通过JNI调用libmedia库。由于JNI的存在可以让我们重用很多已经存在C/C++的库,省去了重复开发的麻烦,并且可以利用很多开源的库(Android库中就有很多开源库,比如libjpeg,libpng等等),并且让我们开发的程序更有效率(C/C++代码发挥硬件最佳性能)。如果你对标准JNI不熟悉的话,可以先参考我的博文《Linux下JNI实现》,文中介绍了怎样用标准JNI在Linux系统中实现一个Helloworld程序,可以让你对JNI有一个初步的认识。本文简单介绍一下怎样在Android下面怎样用JNI开发程序,并开发一个经典Helloworld应用程序。

交叉编译环境

    首先是要搭建交叉编译环境,因为Java层的应用程序是和硬件无关的,JDK编译即可;但是Native C/C++代码是和硬件相关的,必须要用交叉编译器编译成特定硬件可执行代码。请根据你的硬件平台搭建你的交叉编译环境,我的MIPS平台,当然选择的是MIPS的交叉编译器,如果你是Arm的请配置自己的交叉编译器。

    我们首先编译一个Native C的helloworld程序,一个学习怎样在Android中增加一个程序,另外也可以验证我们的交叉编译环境是否正确,可以参考《Android编译环境(1) – 编译Native C的helloworld模块》。如果这个步没有问题说明你的交叉编译环境是没有问题的,可以继续往下面进行。

Java编写的Android应用程序

    我们首先用java编写helloworld应用程序(APK),这个代码很简单创建一个HelloWorld activity。代码如下:

package com.simon;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class HelloWorld extends Activity {
    private static final String TAG = "HelloWorld";
    static {
	System.loadLibrary("helloworld");
    }
    private native String printJNI();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.d(TAG, "Activity call JNI: " + printJNI());
    }
}

     这个HelloWorld Activity非常简单,只是调用JNI接口printJNI()打印一些信息到Android logger上面。我们需要关注一下的是printJNI()的声明,有一个native的关键字,说明他是一个用native代码实现的函数,需要用JNI调用Native代码。另外注意static代码段,这段代码意思是当类HelloWorld第一次被加载的时候,加载libhelloworld.so(请注意这里写的是库名称,在Linux中共享库名为xxx共享库,文件存在形式为libxxx.so。所以loadLibrary的参数不是libhelloworld.so,而是helloworld。如果写错误了将会加载库失败,将会收到异常)。

C语言实现helloworld共享库

     接下来我们需要来完成Native 代码部分了,这里需要强调一下,Android JNI实现中为C/C++提供了两套不同的API,调用的时候需要注意,否则非常有可能你会受收到一些libc库的崩溃信息,没准儿会把你整“崩溃”,呵呵!下面先实现Native C来实现helloworld库。

     如果你对Java标准JNI熟悉的话,肯定知道javah工具,可以根据java源程序,生成Native代码的头文件(可以参考我的博文《Linux下JNI实现》)。如果你是在Eclipse中开发apk的话,可以在打开终端进入bin目录,然后执行:

javah com.simon.HelloWorld

你将会得到,一个头文件com_simon_Helloworld.h,这里包含有printJNI接口的C/C++声明。这个声明肯定正确,如果你把printJNI接口声明写错了,HelloWorld将找不到printJNI接口,然后产生崩溃。

     我们创建com_simon_Helloworld.c文件,并在该文件中输入:

#define LOG_TAG "HelloWorld"
#include <utils/Log.h>

/* Native interface, it will be call in java code */
JNIEXPORT jstring JNICALL Java_com_simon_HelloWorld_printJNI(JNIEnv *env, jobject obj) {
    LOGI("Hello World From libhelloworld.so!");
    return (*env)->NewStringUTF(env, "Hello World!");
}

/* This function will be call when the library first be load.
 * You can do some init in the libray. return which version jni it support.
 */
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
    void *venv;
    LOGI("JNI_OnLoad!");
    if ((*vm)->GetEnv(vm, (void**)&venv, JNI_VERSION_1_4) != JNI_OK) {
        LOGE("ERROR: GetEnv failed");
        return -1;
    }
    return JNI_VERSION_1_4;
}

请注意Java_com_simon_HelloWorld_printJNI函数的名字,这个名字是符合JNI规范的,Java_开头,后面紧跟着调用他类名(包含包名和类名,com_simon_HelloWorld),然后才是接口的名字printJNI。这样java虚拟机就可以在com.simon.HelloWorld类调用printJNI接口的时候自动找到这个C实现的Native函数调用。你可能注意到这个名字非常的长,作为一个函数名它非常有可能不是一个好的选择。JNI API允许你提供一个函数映射表,注册给Jave虚拟机,这样Java虚拟机就可以用函数映射表来调用相应的函数,就可以不必通过函数名来查找需要调用的函数了。这样你的函数名也可以随便定义了(可以定义最能表现函数功能的函数名),这个将会在helloworld共享库的C++实现中演示。但是Android系统中,还是推荐用JNI标准的函数名定义的。

    JNI_OnLoad函数JNI规范定义的,当共享库第一次被加载的时候会被回调,这个函数里面可以进行一些初始化工作,比如注册函数映射表,缓存一些变量等,最后返回当前环境所支持的JNI环境。本例只是简单的返回当前JNI环境。

注意网上很多例子都说可以不实现JNI_OnLoad,我发现如果不是实现的话,printJNI只可以返回整型类型的值,如果返回其他类型的值都会崩溃。并且GetEnv的调用也是必须的,否则也是崩溃,但是GetEnv的返回值我并没有用到,这些地方使我非常迷惑,期待达人解惑。

    接下来编写Android.mk文件,创建之,并输入:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:=com_simon_Helloworld.c

LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)

LOCAL_MODULE := libhelloworld

LOCAL_SHARED_LIBRARIES := libutils

LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)

     这里面有几个标签需要说明:

1、LOCAL_C_INCLUDES说明包含的头文件,这里需要包含JNI的头文件。

2、LOCAL_MODULE当前模块的名称

3、LOCAL_SHARED_LIBRARIES当前模块需要依赖的共享库,因为在hellowold中我们调用Android打印系统输出到logger,所以我们必须要依赖libutils库。

4、LOCAL_PRELINK_MODULE指明该模块是否被启动就加载,可以参考《动态库优化——Prelink(预连接)技术》。我们的helloworld库不需要prelink,所以置为false。

    编译这个模块,根据你的环境不同,选择不同的编译途径。然后安装apk,然后运行他们,通过logcat工具将会看到相应的输出。

转自:http://blog.youkuaiyun.com/gemmem/article/details/7289997


Android JNI 入门(含完整Demo),初级安卓开发面试题 #define TAG “szj” //…我都不知道要传什么,可以借助 JNI 中的宏来传入 #define LOGD(…)__android_log_print(ANDROID_LOG_DEBUG,TAG,VA_ARGS); #define LOGI(…)__android_log_print(ANDROID_LOG_INFO,TAG,VA_ARGS); #define LOGE(…)__android_log_print(ANDROID_LOG_ERROR,TAG,VA_ARGS);//函数具体实现 e 阅读详情

相关推荐

Android Studio NDK开发案例一 JNI开发入门

        最近在做Android的项目,用到了JNI,现将NDK的开发流程和方法整理出来,希望能够让刚接触的小伙伴们少走一些弯路。 NDK         Native Development Kit(NDK)是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java一起打包成apk。 JNI         Java Native In...

他乡&学子 3247

Android JNI开发深度学习

在基本了解JIN后,如您对JNI进阶学习感兴趣,请阅读本篇博文,帮助您进一步深入学习JNI函数开发。该篇博文从JNI的原理、函数创建及规则、Java与C/C++互调操作、JNI开发的各细则进行详细说明分析,希望能帮助大家能够快速熟练JNI的开发。

luo_boke的博客 7734

Android Studio JNI开发指南:从入门到精通!

JNI(Java Native Interface)是一种用于在Java和本地代码之间进行交互的技术。它为开发人员提供了使用C/C++编写高性能本地代码的能力,并将其与Java代码无缝集成。本文将介绍如何在Android Studio中进行JNI开发,帮助您快速入门并逐步精通这一技术。

CodeJolt的博客 448

Android JNI 开发

①:NDK与JNI简介 NDK:Native Development Kit,是Android的一种开发工具包,能够快速开发C,C++的动态库,并自动将so和应用打包成APK。而NDK的使用场景就是通过NDK在Android中使用JNI。 JNI:Java Native Interface的缩写,即Java的本地接口,JNI可以使得Java与C,C++语言进行交互。 NDK优点: 1.APK的Java层代码很容易被反编译,而C/C++库反编译难度较大 2.将要求高性能的应用逻辑使用C开发,从而提高

qq_37565670的博客 3197

Android JNI开发入门实战指南

JNI(Java Native Interface)是Java平台提供的一种标准接口,允许Java代码与C/C++等本地语言进行高效交互。在Android开发中,JNI不仅为计算密集型任务(如音视频编解码、图像处理)提供了性能优化路径,还支持复用成熟的原生库(如FFmpeg、OpenCV),并可直接访问系统底层资源或硬件接口。其核心机制基于JNIEnv指针和jobject实例,实现跨语言函数调用与数据传递。通过。

weixin_35748962的博客 1035

Android Studio JNI开发从入门到实践

JNI(Java Native Interface)是Java平台提供的一套标准接口规范,允许Java代码与本地代码(如C/C++)进行高效交互。在Android开发中,JNI不仅承担着连接Java虚拟机与本地运行环境的桥梁作用,还为性能敏感型任务(如音视频处理、图像识别、游戏引擎等)提供了底层优化的可能性。其核心作用机制在于通过JNI接口,Java层可以调用C/C++实现的本地方法,反之亦然。这种跨语言调用能力,使得开发者可以在保证应用可维护性的同时,充分发挥底层硬件的性能优势。

weixin_35879493的博客 1011

Android JNI开发从0到1,java调C,C调Java,保姆级教程详解

第三歩,在app目录下的build.gradle文件中的,android{}闭包中,指定CMakeLists.txt路径。2.根据命令行javah +JNI2的全类名,生成com_example_jniproject_JNI2.h头文件。在app目录下,指定CmakeLists.txt文件,根据注释进行相应添加。3.根据jni协议,去写对应的c代码,创建Test.c文件,代码如下。2.根据命令行,javah +JNI3全类名,生成对应的头文件。第五步,C代码调用Java代码,首先创建JNI3.java。

路宇的博客 2657

S7-200 Smart 控制运动轴(脉冲电机/伺服)教程

S7-200 Smart 控制运动轴(脉冲电机/伺服) 结合本人刚接触触摸屏时候的踩坑经验,编写S7-200 Smart 控制运动轴(脉冲电机/伺服)的详细流程,给刚接触PLC的朋友提供一些经验指导。 本文详细介绍了S7-200 Smart 控制脉冲步进/伺服电机流程,包含接线方法及梯形图。希望对初学者有所帮助

xjbsw0的博客 5万+

Android开发——JNI开发

JNI不是Android特有的,是通用的。用于Java与C++(C)层代码的相互调用。Java是解释型语言,虽然JVM经过了很多优化,性能大大提高,但是始终比不上C++这种编译型语言。从Android架构来看,framework层为Java语言编写,但是很多实际运行的却是在Native层(C\C++语言编写)。

一切皆是定数的博客 1312

STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入

本例程使用STM32G070xx芯片,Flash大小128KB,Flash每页(2048字节)写满后再擦除。操作存储区分为64块,每块32字节,即写满64次擦除一次;标定存储区分为16块,每块128字节,即写满16次擦除一次,每个存储区的块都有各自的头部标记

RaphaelCeo的博客 1544

Verilog数字钟

使用Verilog语言进行的数字钟的编写,FPGA开发板亲测正常 大学生一个,第一次自己做的东西,写出来分享在这里插入代码片一下,有不对的地方请大家批评指正。 这次的做的题是:设计一个数字钟,该数字钟能进行正常的时,分计时功能,且能对数字钟的时间进行调整。 该数字钟有3个按键,按键1为功能键,用于数字钟在“正常计时”,“时调整”,“分调整”这三个功能之间切换;按键2,3用于调整时间,仅当数字钟处于...

bin_bin_bun的博客 6149

Android高级开发第一篇 - JNI(初级入门篇)

本文介绍了Android JNI开发的初级入门知识。首先解释了JNI的概念及其应用场景,如调用高性能库、系统接口等。接着详细说明了开发环境准备和创建支持JNI的Android项目步骤。通过一个"Hello from C++"示例,分析了Java和C++代码的对应关系,包括函数命名规则、JNI关键语法等。文章还讲解了CMake构建脚本配置,并提供了常见问题排查方法。最后预告了后续将介绍JNI参数传递和双向调用等内容。适合有Java/Android基础但零JNI经验的开发者入门学习。

2503_90221393的博客 978

非root用户如何在CentOS7集群上编译安装OpenFOAM6

本文详细介绍了在CentOS7集群上以非root用户身份编译安装OpenFOAM6的完整流程。通过环境准备、依赖包离线获取、源码编译安装等步骤,解决了集群环境下权限和依赖问题,特别针对OpenMPI和Boost库提供了优化配置建议,帮助用户高效完成安装并优化性能。

weixin_28826961的博客 681

Android JNI开发入门

Android JNI开发入门 1 前言 JNI作为JAVA与C/C++库的一种交互方式,在Android系统中被广泛使用,本文将与您一道学习Android中JNI的使用。 因为作者是JNI的初学者,JNI编程经验有限,如有遗漏或有误的地方,请大家帮忙指出,感谢!   2 ANDROID JNI简介 JNI是Java NativeInterfac

ydhua1988的专栏 1331

2025年VSCode AI插件实战:如何用Devika+Continue+Tabby三件套10倍提升开发效率

本文详细介绍了2025年VSCode AI插件Devika、Continue和Tabby的三件套组合,如何通过智能开发工作流10倍提升开发效率。从项目架构生成到上下文感知辅助,再到本地化智能编码,这套方案实现了从需求分析到代码生成的全流程自动化,特别适合中大型项目开发。

weixin_26911099的博客 269

2017年全国大学生电子设计竞赛综合测评题目解析——Multisim仿真

1.题目 给定两个单电源的双运放芯片READ2302G芯片(当时记得增益带宽积好像是6M),一片HD74LS74数字芯片双D触发器,需要详细电路图、手写报告,5个波形输出,测频,测幅,8:00公布题目,15:00停止答题,中间可以吃饭(也可以不吃继续做),15:00清场,休息一段时间后开始进场测试,打分。 2.要求 (1)一片运放搭建方波振荡电路,频率 20 KHz,误差 0.1 KHz,幅度 3...

DengFengLai123的博客 2万+

Android Studio jni开发之经典入门demo

此文记录一下Android Studio 进行jni开发的基础配置以及入门教程,每次都参考网上的,自己记录一下,以后就省事儿了。 一、环境配置 主要需要配置的就是NDK(Native Development Kit),可以一键下载: File → Setting → 按截图找到如下路径 → 选择NDK → 确定下载安装完成以后就可以开始coding了. 二、新建一个项目新建一个项目testJni1

FeiPeng_的博客 1145

全志A133的AndroidSDK

本小节来学习如何下载全志安卓SDK,SDK的目录,编译和烧录提示:以下是本篇文章正文内容,下面案例可供参考以上就是整个SDK的目录和编译烧录,目的在于让初学者快速了解整个源码的目录和编译出镜像喜欢就订阅吧。

qq_24093081的博客 4054

Android Studio jni开发入门——看我就够了!

1 此贴记录一下Android Studio 进行jni开发的基础配置以及入门教程,想当初使用eclipse配置ndk环境都难,现在基本都向AS转型,特此给需要帮助的新手村的同学们少走弯路☺ 一、环境配置 主要需要配置的就是NDK(Native Development Kit),现在Android studio很便利,可以一键下载: file → setting →

秦军锐士的博客 616

Python爬虫实战:绕过Cloudflare反爬的最新技术与完整代码详解

在互联网数据采集领域,越来越多的网站开始部署CDN和安全防护服务,其中 Cloudflare 是最为广泛使用的防护方案之一。它不仅为网站提供DDoS防护,还能通过JS挑战、验证码和行为分析来识别并拦截爬虫。这给爬虫工程师带来了极大挑战——如何在不违反网站服务条款的情况下,实现有效的数据采集?本文将分享Python领域绕过Cloudflare反爬的最新技术方法,结合最新流行库与自动化浏览器,帮助你攻克这一难题。绕过Cloudflare反爬不是一蹴而就,需结合多技术、多策略,持续迭代。

2201_76125261的博客 2628

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android Studio JNI开发入门教程

Android Studio JNI开发入门教程 2016-08-29 14:383269人阅读评论(0)收藏举报 分类: JNI(3) 目录(?)[+] 概述 在Andorid Studio不支持JNI开发之前大家一般都是使用Eclipse开发JNI,各种配置让人觉得很蛋疼。从Andorid Studio支持...

abpwben298703的博客 113

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

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

Android jni开发入门

首先先来认识:NDK 和 JNI介绍 JNI (Java Native Interface)是一套编程接口,用来实现java代码和其他语言(c、C++或汇编)进行交互。这里需要注意的是JNI是JAVA语言自己的特性,也就是说JNI和Android没有关系。在Windows下面用JAVA做开发也经常会用到JNI,例如:读写系统注册表等。 NDK(Native Development Kit)是G...

qq_35022307的博客 306

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 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android之JNI开发入门

③ 如果写的是.c的文件 先修改一下生成的.cpp文件的扩展名 不要忘了 相应修改Android.mk文件中LOCAL_SRC_FILES的值。),ANDROID_LOG_DEBUG表示优先级 debug ANDROID_LOG_INFO表示info 这些在log.h中可以看到。window->preferences->左侧选择android->ndk 把ndk解压的目录指定进来。最后一个参数表示是否拷贝,可以不用传值。//返回int* 返回该数组的首地址 这样就可以直接通过该指针直接操作该数组了。

2401_87195798的博客 2348

Android 开发 之 JNI入门 - NDK从入门到精通

http://www.hanshuliang.com/?post=3

benkye的专栏 213

安卓实战开发之JNI入门及高效的配置(android studio一键生成.h,so及方法签名)

前言以前也讲过NDK开发,但是开始是抱着好玩的感觉去开始的,然后呢会helloWord就觉得大大的满足,现在静下来想这NDK开发到底是干什么呢? NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西;另外就是为了效率更加高效些但是在java与C相互调用时平白又增大了开销(其实效率不见得有所提高),然后呢,基于安全性的考虑也是为了防止代码被反编译我们为了安全起见,使用C语言来编写这些重

Losileeya 1万+
上一篇: 设计模式原则详解
下一篇: Android JNI开发入门之二
HabbyGe
博客等级 码龄16年 46粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值