添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • Java 中声明 Native 方法(即需要调用的本地方法)
  • 编译上述 Java 源文件javac(得到 .class 文件)
  • 通过 javah 命令导出 JNI 的头文件( .h 文件)
  • 使用 Java 需要交互的本地代码 实现在 Java 中声明的 Native 方法

    Java 需要与 C++ 交互,那么就用 C++ 实现 Java Native 方法

  • 编译 .so 库文件
  • 通过 Java 命令执行 Java 程序,最终实现 Java 调用本地代码
  • 更加详细过程请参考本文第4节:具体使用

    NDK是属于 Android 的,与 Java 并无直接关系

  • 作用:快速开发 C C++ 的动态库,并自动将 so 和应用一起打包成 APK
    即可通过 NDK Android 中 使用 JNI 与本地代码(如C、C++)交互
  • 应用场景:在 Android的场景下 使用JNI

    Android 开发的功能需要本地代码(C/C++)实现

    比如 Android 需要与 C++ 交互,那么就用 C++ 实现 Java Native 方法

  • 通过 ndk - bulid 命令编译产生 .so 库文件
  • 编译 Android Studio 工程,从而实现 Android 调用本地代码
  • 更加详细过程请参考本文第4节:具体使用
  • 关联 Andorid Studio 项目 与 NDK
  • 创建本地代码文件(即需要在 Android 项目中调用的本地代码文件)
  • 创建 Android.mk 文件 & Application.mk 文件
  • 编译上述文件,生成 .so 库文件,并放入到工程文件中
  • Andoird Studio 项目中使用 NDK 实现 JNI 功能
  • 步骤1:配置 Android NDK环境

    具体请看文章 手把手教你配置Android NDK环境

    步骤2: 关联Andorid Studio项目 与 NDK

  • 当你的项目每次需要使用 NDK 时,都需要将该项目关联到 NDK

    1. 此处使用的是 Andorid Studio ,与 Eclipse 不同
    2. 还在使用 Eclipse 的同学请自行查找资料配置
  • 具体配置如下

  • a. 在 Gradle local.properties 中添加配置

    ndk.dir=/Users/Carson_Ho/Library/Android/sdk/ndk-bundle

    ndk 目录存放在 SDK 的目录中,并命名为 ndk-bundle ,则该配置自动添加

    JNIEXPORT jstring JNICALL Java_scut_carson_1ho_ndk_1demo_MainActivity_getFromJNI(JNIEnv *env, jobject obj ){ // 参数说明 // 1. JNIEnv:代表了VM里面的环境,本地的代码可以通过该参数与Java代码进行操作 // 2. obj:定义JNI方法的类的一个本地引用(this) return env -> NewStringUTF( "Hello i am from JNI!" ); // 上述代码是返回一个String类型的"Hello i am from JNI!"字符串

    此处需要注意:

  • 如果本地代码是 C++ .cpp 或者 .cc ),要使用 extern "C" { } 把本地方法括进去
  • JNIEXPORT jstring JNICALL 中的 JNIEXPORT JNICALL 不能省
  • 关于方法名 Java_scut_carson_1ho_ndk_1demo_MainActivity_getFromJNI
    1. 格式 = Java _包名 _ 类名_Java需要调用的方法名
    2. Java 必须大写
    3. 对于包名,包名里的 . 要改成 _ _ 要改成 _1
  • 如我的包名是: scut.carson_ho.ndk_demo ,则需要改成 scut_carson_1ho_ndk_1demo 最后,将创建好的 test.cpp 文件放入到工程文件目录中的 src/main/jni 文件夹
    若无 jni 文件夹,则手动创建。

    下面我讲解一下JNI类型与Java类型对应的关系介绍
    LOCAL_MODULE := hello_jni // 设置模块的名称,即编译出来.so文件名 // 注,要和上述步骤中build.gradle中NDK节点设置的名字相同 LOCAL_SRC_FILES := test.cpp // 指定参与模块编译的C/C++源文件名 include $(BUILD_SHARED_LIBRARY) // 指定生成的静态库或者共享库在运行时依赖的共享库模块列表。 最后,将上述文件同样放在`src/main/jni`文件夹中。

    APP_ABI := armeabi
    // 最常用的APP_ABI字段:指定需要基于哪些CPU平台的.so文件
    // 常见的平台有armeabi x86 mips,其中移动设备主要是armeabi平台
    // 默认情况下,Android平台会生成所有平台的.so文件,即同APP_ABI := armeabi x86 mips
    // 指定CPU平台类型后,就只会生成该平台的.so文件,即上述语句只会生成armeabi平台的.so文件
    最后,将上述文件同样放在`src/main/jni`文件夹中
    // 步骤1:进入该文件夹
    cd /Users/Carson_Ho/AndroidStudioProjects/NDK_Demo/app/src/main/jni 
    // 步骤2:运行NDK编译命令
    ndk-build
    @Override protected void onCreate (Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 通过Button调用JNI中的方法 Button = (Button) findViewById(R.id.button); Button.setOnClickListener( new View.OnClickListener() { @Override public void onClick (View v) { Button.setText(getFromJNI());

    主布局文件: activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="scut.carson_ho.ndk_demo.MainActivity">
        // 此处设置了一个按钮用于触发JNI方法
        <Button
            android:id="@+id/button"
            android:layout_centerInParent="true"
            android:layout_width="300dp"
            android:layout_height="50dp"
            android:text="调用JNI代码" />
    </RelativeLayout>
    在AS中进行NDK开发之前,我们先来简单的介绍几个大家都容易搞懵的概念:    1.到底什么是JNI,什么是NDK?    2.何为“交叉编译”?  先看什么是JNI?JNI的全称就是JavaNati... 来自: Hi_Red_Beetle的博客 翻不了墙的话,可以用迅雷下载最新版本r18https://dl.google.com/android/repository/android-ndk-r18b-windows-x86.ziphttps:... 来自: 学习备忘录 源头由于androidstudio不断地在完善ndk的开发,所以市面上好多文章已经过时了。本文将从两种方法来讲解如何在androidstudio3.0上进行ndk的配置。 本文章会学到如下操作:1.从... 来自: 【我的Android进阶之旅】 最新版本r16https://dl.google.com/android/repository/android-ndk-r16-windows-x86.ziphttps://dl.google.com... 来自: zmzsoftware的专栏 1.Native(Android层面开发)2.JNI(Android和C/C++连接层处理)3.C/C++(逻辑处理层)AndroidJNI/NDK开发真的很难吗?不不不,三步快速上手... 来自: Ruffian-痞子 目前不仅是国内不好找到各个版本的NDK,就连谷歌翻链接也总是出问题,这里给出一些各个版本的链接。ndk_r12(June2016)Windows32-bit:http://dl.google.com/... 来自: shuzfan的专栏 http://blog.csdn.net/banketree/article/details/12167145首先我们要知道Java是如何调用c/c++的什么是JNIjavanativeinterfa... 来自: 这个时代,作为程序员可能要学习小程序 一、概要最近项目需要,要把代码中加密的部分打包成so文件,刚开始接触的时候真是痛苦呀,网上好多资料,都不是很详细,步骤也不清晰,所以我整理了一下,希望大家喜欢。现在androidstudio打包so文... 来自: 诚(cheng)的博客 Android之NDK开发 一、NDK产生的背景  Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的... 来自: u014702999的专栏 FROM:http://blog.csdn.net/l1028386804/article/details/47405683转载请注明出处:http://blog.csdn.net/l10283868... 来自: 茫茫大士的专栏 简介项目决定移植一款C++开源项目到Android平台,开始对JNI深入研究。JNI是什么?JNI(JavaNativeInterface)意为JAVA本地调用,它允许Java代码和其他语言写的代码进... 来自: 孤舟蓑笠翁,独钓寒江雪。 JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在JavaFramework层。这一个系列我们来一起深入学习JNI。... 来自: 刘望舒的专栏 1为什么使用JNI?JNI的强大特性使我们在使用JAVA平台的同时,还可以重用原来的本地代码。作为虚拟机实现的一部分,JNI允许JAVA和本地代码间的双向交互。请记住,一旦使用JNI,JAVA程序就丧... 来自: lintcgirl的博客 Chap1:JNI完全手册...3Chap2:JNI-百度百科...11Chap3:javah命令帮助信息...16Chap4:用javah产生一个.h文件...17Chap5:jni教程(veryv... 来自: zerokkqq的专栏 今天开始研究JNI技术,首先还是老套路,输出一个HelloWorld:具体流程如下:在Java中定义一个方法,在C++中实现这个方法,在方法内部输出“HelloWorld",然后再回到Java中进行调... 来自: Android应用安全防护和逆向分析-----作者 最近在一台新电脑上面装XX-Net,刚开始扫描IP贼慢,当时没多在意,今天在github上面突然发现XX-Net新增了一条日志:2017-09-228月份开始,GAE封锁加剧,请更新到3.6.3,慢慢... 来自: IVON Android自身使用了谷歌的openssl分支boringssl,因此,如果要在Android中使用openssl,需要编译成静态库集成在自己的程序当中。为Android编译openssl,首先需要... 来自: hnlylyb的博客 一、下载&编译静态库1.下载源码和脚本下载解压,修改脚本名称为小写mkdiropensslcdopenssl/wgethttps://www.openssl.org/source/openssl-1.... 来自: sslinp的博客 目标:目前很多Android手机已经自带了openssl库,即libssl.so,libcrypto.so,以下示例实现了APK通过NDK调用openssl库函数PKCS5_PBKDF2_HMAC(密... 来自: lindev的专栏 前言需求:需要在NDK层对一个Java层的字符串进行RSA加密,然后对加密的结果进行Base64返回到Java层方案:选择使用OpenSSL来实现。编译libssl.a和libcrypto.a静态库在... 来自: 魔都三帅 1、gcc的sysroot选项sysroot选项设定gcc在编译源码的时候,寻找头文件和库文件的根目录。可以这样调用gcc--sysroot=/tmp/gcc-arm(及其他选项)。NDK根目录下的p... 来自: qq_41163331的博客 1.0功能概述1.0.1概述在android开发中,java调用C/C++函数库是经常遇到的,我们的android开发中使用JNI开发技术,有下面几种情况:已经使用C/C++发了某些函数库,如果再使用... 来自: hongbochen1223的专栏 开始之前最近学习了一下NDK的开发,就来分享一下.对一个新鲜事物,我们先解决的无非就是三件事情:是什么?为什么?怎么做?.NDK简介(英语:nativedevelopmentkit,简称NDK)是一种... 来自: 张鹿鹿的专栏 最近博主在研究JNI,在AndroidStudio中开发JNI中遇到一些坑,记录下来,希望给需要的人提供一些解决方法.JNI(JavaNativeInterface)Java本地接口.其实就是一种协议... 来自: Young卡卡的博客 Java通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在Windows平台下是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使Java可以实现和本地机器... 来自: Tongseng‘s Blog 前言(废话,可以略过):这两天接触了AndroidNDK(NativeDevelopmentKit)开发,学习的时候看教程中使用的是eclipse,但是我觉得有必要弄清楚在AndroidStudio上... 来自: sinat_19385391的博客 Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实... 由于技术和表达能力有限,直接上重点,主要是针对jni及NDK使用过程中的问题。首先搭建好NDK环境,作为一个刚开始使用的NDK的工程师,肯定会相当陌生,于是乎,参考别人,搜索的日子就来了。由于Andr... 来自: wu_jian_wu的博客 前言要学习NDK之前,我们得先在AndroidStudio中学习JNI,还有C和C++基础,这些都是接触NDK的前提,那么废话不多说,开始吧对于NDK在AndroidStudio的配置,可以关注我的博... 来自: 进入目录视图点击置顶文章查看博客目录(全站式导航) 前言在Android开发中,使用NDK开发的需求正逐渐增大但很多人却搞不懂JNI与NDK到底是怎么回事今天,我将先介绍JNI与NDK&amp;amp;之间的区别,手把手进行NDK的使用教学,希望你们会... 来自: baidu_38172402的博客 NDK能够在Android应用中使用原生代码对于想执行以下一项或多项的开发者特别有用:在平台之间移植其应用重复使用现有库主要组件:ndk-build:ndk-build脚本用于在NDK中心启动构建脚本... 来自: lgyu9303的博客 最近在学习NDK开发,这是NDK篇的第一节。对jni和ndk的基本认识。JNI的基本概念?jni是一个协议。这个协议用来沟通Java代码和外部的本地代码(c/c++),通过这个协议,Java代码可以外... 来自: 这个时代,作为程序员可能要学习小程序 1、ndk-build的用法AndroidNDKr4引入了一个新的、小巧的shell脚本ndk-build,来简化源码编译。该文件位于NDK根目录,进入你的工程根目录或子目录之后,在命令行下调用即可。... 来自: saydo 不知道有多少朋友像我一样,被AndroidNDK开发的环境配置折腾到吐,然后放弃。从事Android工作几年了,也不太愿意接触NDK开发。不过福利终于来了,新的AS中开始使用CMake开发jni,开发... 来自: 问道 Android JNI作用及其详解JavaNativeInterface(JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI是本地编程接口,它使得在Java虚拟机... 来自: 索峰的个人专栏 转载请标明出处:http://blog.csdn.net/shensky711/article/details/52806794本文出自:【HansChen的博客】概述对于JNI,有些童鞋在没有接触过... 来自: HansChen的博客 移植openssl到android创建工作目录,并进入12mkdirandroidcdandroid下载源码12wgethttps://www.openssl.org/source/openssl-1... 来自: omnispace的博客 OpenSSL是一个强大的开源安全套接字层密码库,它包含了主要的密码学算法,常用的密钥和证书封装管理以及SSL协议,并提供丰富的应用程序供测试或其他目的使用。在Android上开发对于安全的需求越来越... 来自: 明潮的BLOG 一、NDK独立工具链编译安装     本人使用的是CentOSlinux,ndk版本为android-ndk-r16b,我使用的是root用户  1、下载linux版本NDKandroid-ndk-r... 来自: lin_cloud211的博客 0前言按照源代码C:\openssl-1.1.0f下的INSTALL文件中的编译指导,在Windows中用Cygwin模拟Linux环境顺利编译出libcrypt.a和libssl.a,然而在Andr... 来自: mandagod的博客 一、jobject和jclass1.如果定义native方法时使用了static关键字,那么生成的头文件里就会传入jclass,代表这个类的引用。2.如果没有使用static关键字,那么就会传入job... 来自: magicwangcsdn的博客 androidstudio串口通信JNI、NDK配置最近刚好要做关于串口通信的项目,需要用到JNI,于是就去百度关于android这一块串口通信怎么使用,但是发现很多的配置都是eclipse的而关于s... 来自: qiuyin2015的博客 前言做过Java的朋友都知道,内存管理这一块是完全透明的,new一个类的实例时,只知道创建完这个类的实例后,会返回这个实例的一个引用,然后拿着这个引用去访问它的成员了(属性、方法),完全不用管JVM内... 来自: stromxu 的专栏 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且... 来自: 鹏霄万里展雄飞 原文地址:反置页表作者:hilg 在分页系统中为每个进程配置一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。在现代计算机系统中通常允许一个进程的逻辑地址空间非常大,因此就有很多页表... 来自: 月光轩辕的专栏 项目地址:https://github.com/helloworlde/SpringBoot-DynamicDataSource/tree/dev 在 Spring Boot 应用中使用到了 MyB... 来自: HelloWood 我用的是c++,所以我举一个c++的例子,简单说一下thrift的使用入门。例子描述是这样的:我们将学生信息(学号,姓名,性别,年龄)由客户端发送到服务端。实现这个例子,我们大致要做以下几部分事情:(... 来自: xiaoshe的专栏 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算。可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行。但是机器码是按顺序执行的,一个复杂的多步... 来自: shenjie12345678的专栏 最近,在工作中遇到一个问题,问题描述:一个用户在登录成功以后会把用户信息存储在session当中,这时session所在服务器为server1,那么用户在session失效之前如果再次使用app,那么... 来自: sxiaobei的博客 Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的Thread... 来自: u011860731的专栏 bsgs算法,又称大小步算法(某大神称拔山盖世算法)。 主要用来解决   A^x=B(mod C)(C是质数),都是整数,已知A、B、C求x。(poj 2417 Discrete Lo... 来自: clover_hxy的博客 Hive的后端存储是HDFS,它对大文件的处理是非常高效的,如果合理配置文件系统的块大小,NameNode可以支持很大的数据量。但是在数据仓库中,越是上层的表其汇总程度就越高,数据量也就越小。而且这些... 来自: yycdaizi的专栏 前段时间看了一些关于LSTM方面的论文,一直准备记录一下学习过程的,因为其他事儿,一直拖到了现在,记忆又快模糊了。现在赶紧补上,本文的组织安排是这样的:先介绍rnn的BPTT所存在的问题,然后介绍最初... 来自: 天道酬勤,做一个务实的理想主义者 C_SVC推导1. 模型假设假设现在有训练数据XX,是m∗nm*n的矩阵,mm是样本数量,nn是样本向量的维数,记样本中第ii个样本为x(i)x^{(i)},标签为y(i)y^{(i)},y∈{+1,... 来自: u011529752的博客 单机最大的TCP连接数及其修改 一个误解: 单个服务器程序可承受最大连接数“理论”上是“65535” .    65535这个数字的由来,很多人想当然地将它与port最大值联系起来。的确,TCP的... 来自: 田发江的专栏 转载:http://blog.csdn.net/chenggong2dm/article/details/50906765     pycharm可以很方便的管理Python的解释器(如果安装了多个... 来自: 荪荪的博客 问题场景描述整个项目通过Maven构建,大致结构如下: 核心Spring框架一个module spring-boot-base service和dao一个module server-core 提供系统... 来自: 开发随笔 Spring Data JPA调用存储过程实例作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszsJPA连接到数据库,调用存储... 来自: chszs的专栏 老外的原文:《Multiresolution gray-scale and rotation invariant texture classification with local binary pa... 来自: Where there is life, there is hope reids是一个key-value存储系统,为了保证效率,缓存在内存中,但是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,以保证数据的持久化。 所以:redis是一... 来自: 那么好, 本文是笔者刚刚接触QGIS相关博客资源时找到的一篇文章,全文比较长,因此分成两篇发布。就内容而言不代表笔者观点,留待后续一一验证。QGIS和ArcGIS的比较你也许伴随着ArcGIS或者QGIS而成长... 来自: 番茄园