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 的开发工具包。 阅读详情

在这里插入图片描述

引言

在Android开发中,Java是一种主要的编程语言,然而,对于一些性能要求较高的场景(如音视频处理、图像处理、计算密集型任务等),我们可能需要使用到C或C++等语言来编写底层的高效代码。为了实现Java代码与C/C++代码之间的交互,Android提供了一个强大的工具——JNI(Java Native Interface)。通过JNI,Java可以调用C/C++代码,C/C++也可以调用Java代码,从而实现高效的原生交互。

开始之前先了解一些基础概念

开始之前

如果你对C/C++语言比较陌生,可以先看一下我的这两篇文章:
(大致过一下就行,挑重点去记,毕竟不是做C++开发,没必要完全理解,更多的是我们在开发中去学习)

1. 什么是 JNI(Java Native Interface)?


JNI 是 Java 与其他编程语言(通常是 C 或 C++)之间的接口,允许 Java 代码与底层的本地代码进行交互。通过 JNI,我们可以在 Java 代码中调用本地(native)方法,或者让本地代码调用 Java 方法。

1.1 为什么要使用 JNI?

JNI 的主要作用是实现 Java 程序与本地程序之间的交互,特别是在以下几种情况下非常有用:

  • 性能优化:有些运算或操作,Java 实现的效率可能较低,使用 C/C++ 可以提高性能,特别是在图像处理、音视频编解码等领域。
  • 访问底层硬件或特性:Java 不能直接访问底层硬件或操作系统的某些特性,而 JNI 使得 Java 程序可以调用 C/C++ 中的底层代码,进而访问这些特性。
  • 重用现有的本地代码库:有时为了节省开发时间,我们希望直接重用一些已有的 C/C++ 代码或第三方库,这时 JNI 就是连接 Java 和本地代码的桥梁。

1.2 JNI 如何工作?

JNI 的工作机制可以分为几个步骤:

  1. Java 调用 C/C++ 方法:通过在 Java 中声明本地方法(native),并使用 System.loadLibrary() 加载本地库。Java 代码通过 JNI 机制调用底层的 C/C++ 函数。
  2. C/C++ 调用 Java 方法:JNI 允许在 C/C++ 中调用 Java 中的方法,甚至可以操作 Java 对象。
  3. 数据传递:通过 JNI,Java 和 C/C++ 之间可以传递基本数据类型(如整数、浮点数)和复杂的数据结构(如数组、对象等)。

1.3 JNI 的基本结构

  • Java 层:Java 中声明 native 方法,并通过 System.loadLibrary() 加载本地库。
  • 本地层:通过 C/C++ 实现 JNI 接口,并将它编译成共享库(.so 文件)。
  • JNI 头文件:使用 javah 工具(或者在 Android 中通过 ndk-build)生成的头文件,定义了 Java 类与本地方法之间的映射关系。

2. NDK 与 JNI 的关系


在 Android 开发中,NDK(Native Development Kit)是一个工具集,它允许开发者在 Android 应用中编写和使用 C/C++ 代码。JNI 是 NDK 的一部分,它提供了 Android 中 Java 代码和 C/C++ 本地代码之间的交互接口。

2.1 NDK 的功能

NDK 是一组工具和库,允许开发者用 C 和 C++ 编写 Android 应用中的一些性能关键的代码。NDK 提供的功能包括:

  • 访问硬件资源:通过 NDK,你可以直接访问一些低级的硬件特性,比如摄像头、传感器、GPS 等。
  • 性能优化:一些计算密集型的任务(例如图像处理、音视频编解码等)可以通过 C/C++ 实现,性能上更有优势。
  • 使用已有的本地库:有时候开发者会利用一些已有的 C/C++ 库或第三方库,而这些库通常需要通过 NDK 来编译和链接。

2.2 NDK 与 JNI 的结合

  • JNI 是 NDK 与 Java 层之间的桥梁,利用 JNI,Java 层可以调用本地层的 C/C++ 函数,反之,C/C++ 代码也可以调用 Java 层的代码。
  • 使用 NDK 时,JNI 使得 Java 和 C/C++ 之间的数据和方法调用变得可能。
  • 通过 JNI,我们可以在 Java 代码中调用 NDK 中编写的本地方法,或者直接操作 Java 对象。

3. 数据类型


Java、JNI、C/C++ 三者之间的数据类型转换是跨语言编程中的一个核心问题,尤其在涉及到 Java 调用 C/C++ 编写的本地方法时。JNI(Java Native Interface)作为 Java 与 C/C++ 交互的桥梁,提供了一套标准机制来实现 Java 与本地代码之间的数据交换。

3.1 基础类型

Java 通过 JNI 与 C/C++ 交互时,JNI 提供了一些专门的类型和方法来桥接 Java 类型与 C/C++ 类型的差异。

Java 类型JNI 类型C/C++ 类型备注
bytejbytechar (8-bit)JNI 使用 jbyte 来表示 Java 的 byte 类型。
shortjshortshort (16-bit)JNI 使用 jshort 来表示 Java 的 short 类型。
intjintint (32-bit)JNI 使用 jint 来表示 Java 的 int 类型。
longjlonglong long (64-bit)JNI 使用 jlong 来表示 Java 的 long 类型。
floatjfloatfloat (32-bit)JNI 使用 jfloat 来表示 Java 的 float 类型。
doublejdoubledouble (64-bit)JNI 使用 jdouble 来表示 Java 的 double 类型。
charjcharwchar_t (16-bit)JNI 使用 jchar 来表示 Java 的 char 类型,它是 16 位 Unicode 字符,C/C++ 中通常用 wchar_t 来表示宽字符。
booleanjbooleanbool (1-bit)JNI 使用 jboolean 来表示 Java 的 boolean 类型,jboolean 是 8 位的布尔值,通常与 C/C++ 中的 bool 类型兼容。

3.2 引用类型

Java 对象类型通常通过 JNI 提供的 API 转换为 C/C++ 中的指针类型,这些指针类型并不代表实际的数据内容,而是用于访问 Java 对象或方法的接口。

Java 类型JNI 类型C/C++ 类型转换方式JNI API 示例
StringjstringjstringJava String 到 C/C++ 的转换(通过 GetStringUTFChars 或 GetStringChars)env->GetStringUTFChars(jstring, nullptr)
ObjectjobjectjobjectJava 对象到 C/C++ 的转换,可以用来操作任意 Java 对象env->GetObjectClass(jobject)
ClassjclassjclassJava Class 对象到 C/C++ 的转换,通过 FindClass 或 GetObjectClass 获取类引用env->FindClass("java/lang/String")
Array (Object)jobjectArrayjobjectArray对象数组到 C/C++ 的转换,通过 JNI API 访问数组元素env->GetObjectArrayElement(jobjectArray, index)
Array (Primitive)jintArrayjintArray基本类型数组转换(如 int[] 到 jintArray)env->GetIntArrayElements(jintArray, nullptr)
FieldjfieldIDjfieldID通过 JNI 获取字段 ID,通常用于访问 Java 类中的字段env->GetFieldID(jclass, "fieldName", "I")
MethodjmethodIDjmethodID通过 JNI 获取方法 ID,通常用于调用 Java 方法env->GetMethodID(jclass, "methodName", "()V")

4. JNI 中的 Java 签名信息


在学习签名之前,先来看一段Java反射代码:

import java.lang.reflect.Method;

public class ReflectionExample {
    public void sayHello(String name) {
        System.out.println("Hello, " + name);
    }

    public static void main(String[] args) throws Exception {
        // 获取 ReflectionExample 类的 Class 对象
        Class<?> clazz = Class.forName("ReflectionExample");

        // 获取方法 sayHello(String)
        Method method = clazz.getMethod("sayHello", String.class);

        // 创建实例并调用方法
        Object instance = clazz.getDeclaredConstructor().newInstance();
        method.invoke(instance, "World");
    }
}

在clazz.getMethod中,我们通过方法名称 和 参数类型拿到了sayHello方法,在JNI中C/C++ 调用Java的方法也类似,不同点是参数类型 和 返回值 要用签名方式代替(因为C/C++不能直接拿到Java方法嘛),那么JNI中签名长什么样呢?

4.1 基本数据类型的签名

Java 中的基本数据类型对应 JNI 中的签名符号。JNI 使用单一字符来表示 Java 中的基本数据类型。

Java 类型JNI 签名
booleanZ
byteB
charC
shortS
intI
longJ
floatF
doubleD
voidV

4.2 对象类型的签名

Java 对象类型(类类型、接口类型等)的签名格式如下:

  • 以 L 开始,后接类的全名(包括包名),最后以 ; 结尾。例如,String 类型的签名为 Ljava/lang/String;。
  • 注意:数组类型的签名也以 [ 开头,并且每增加一个维度就多一个 [。
Java 类型JNI 签名
StringLjava/lang/String;
ObjectLjava/lang/Object;
int[][I
String[][Ljava/lang/String;
Object[][Ljava/lang/Object;

4.3 方法签名

Java 方法的签名由两部分组成:方法的参数类型和返回类型,方法签名的格式为:(参数类型1, 参数类型2, ...)返回类型。例如,一个有两个 int 参数并返回 String 类型的方法签名为 (II)Ljava/lang/String;。

Java 方法JNI 签名
int add(int a, int b)(II)I
String getName(String name)(Ljava/lang/String;)Ljava/lang/String;
void setValues(int x, int y)(II)V

4.4 构造函数签名

Java 构造函数的签名与普通方法类似,不同之处在于构造函数没有返回类型(V),且通常没有方法名。在 JNI 中,构造函数的签名格式是 (参数类型1, 参数类型2, ...)V。

Java 构造函数JNI 签名
MyClass(int, String)(ILjava/lang/String;)V

4.5 静态方法签名(重点)

静态方法的签名与实例方法类似,唯一的区别是静态方法是类级别的,因此它通过类的对象引用来调用。静态方法的签名与实例方法的签名相同,但 JNI 调用时不需要实例对象。

没必要死记硬背,有规律的,写两遍就记住了

4.6 示例

(1) 获取 Java 方法签名

GetMethodID 或 GetStaticMethodID,拿到相应的方法。

jmethodID methodId = env->GetMethodID(clazz, "methodName", "(I)Ljava/lang/String;");

这个方法的签名为 (I)Ljava/lang/String;,表示该方法有一个 int 类型的参数,返回一个 String 类型。

(2) 获取字段签名
GetFieldID 或 GetStaticFieldID,拿到类的属性字段。

jfieldID fieldId = env->GetFieldID(clazz, "fieldName", "Ljava/lang/String;");

这个字段的签名为 Ljava/lang/String;,表示它是一个 String 类型的字段。

(3) 构造函数签名
通过签名和构造函数名称查找类的构造函数 ID。构造函数的签名与普通方法相同,但没有返回类型。

jmethodID constructorId = env->GetMethodID(clazz, "<init>", "(I)V");

构造函数的签名为 (I)V,表示它接受一个 int 类型的参数并没有返回值。

5. 在Android中使用JNI


5.1 配置项目

在build.gradle包含对NDK的支持:

android {
    ...
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

5.2 编写Java代码

在Java代码中声明本地方法:

public class NativeLib {
    static {
        System.loadLibrary("native-lib");
    }

    public native String stringFromJNI();
}

5.3 编写C/C++代码

在cpp目录下创建对应的C/C++文件,实现上述声明的本地方法:

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_NativeLib_stringFromJNI(JNIEnv* env, jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

5.4 配置CMakeLists.txt

在项目的根目录下,配置CMakeLists.txt 如:

cmake_minimum_required(VERSION 3.4.1)

add_library(
    native-lib
    SHARED
    src/main/cpp/native-lib.cpp)

find_library(
    log-lib
    log)

target_link_libraries(
    native-lib
    ${log-lib})

如果你项目中想写多个.cpp文件,CMakeLists.txt xiugai配置如下:

cmake_minimum_required(VERSION 3.4.1)

add_library(
    native-lib
    SHARED
    src/main/cpp/native-lib.cpp)

add_library(
    native-lib2
    SHARED
    src/main/cpp/native-lib2.cpp)

//更多...

find_library(
    log-lib
    log)

target_link_libraries(
    native-lib
    ${log-lib})
    
target_link_libraries(
    native-lib2
    ${log-lib})

//更多...

即在 find_library 和 target_link_libraries 增加相对应的.cpp文件即可。

6. 实战


因为在写这篇文章之前,我已经完善了一些实战的功能,在此就不一一讲解了,包括:

  • 传递int数据
  • 传递String数据
  • 传递Array数据
  • 在C++中调用Java的返回值Void方法
  • 在C++中调用Java的返回值int方法
  • 在C++中调用Java的返回值String方法
  • 在C++中显示Toast
  • 文本加解密演示
  • 锅炉压力进度条
  • C++ 创建子线程
  • C++ 线程锁之生产者消费者
  • 串口通信(SerialPort) - 可拿来直接使用,已验证功能。

代码已经上传Github:JNIStudy,感兴趣的可以下载看看,里面我加了世上最全注释,由基础到复杂,看不懂来打我!😆

打包为.so文件可以看我的这篇文章:在Android中,将 .cpp 文件编译成共享库(.so 文件)

7. 最后


之前一直对JNI望而却步,真正学过后回头看看,也不是那么的难,难的是你不主动去学。所有伟大,都源于一个勇敢的开始!共勉!

另外给喜欢记笔记的同学安利一款好用的云笔记软件,对比大部分国内的这个算还不错的,免费好用:wolai

Android JNI 入门(含完整Demo) //自动检测 MainActivity 生成宏 #define com_example_jni_MainActivity_A 234L //函数的声明 extern “C” JNIEXPORT jstring JNICALL Java_com_example_jni_MainActivity_getString (JNIEnv *, jobject); #ifdef __cplusplus//如果是 C++ 什么事情都不干 } #endif #endif 这里注释添加的非常清楚,就不在啰嗦了,如若不懂,评论 阅读详情

相关推荐

Android安卓中jni封装代码打包为aar

前文已经介绍jni编译c++代码且已经成功封装成java,但是c++是以源代码形式继承在app中,本文介绍如何将前述jni c++代码以隐藏源代码封装成aar的形式。

热爱生活,忠于自己 1560

JNI详解

JNI

weixin_46987432的博客 1万+

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

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

CodeJolt的博客 448

JNI编程详解

package com.example.testjni; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle

李棚的优快云专栏 9729

Android JNI开发入门实战指南

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

weixin_35748962的博客 1035

Android Studio中JNI编程入门实践指南

Android Studio是谷歌官方开发的集成开发环境(IDE),为Android应用开发提供了丰富的工具和功能。它提供代码编辑、调试、性能分析和应用打包等一站式服务。自2013年推出以来,已经成为开发者首选的Android应用开发平台。使用Android Studio创建项目是开发Android应用的第一步,它提供了项目模板、项目依赖配置、API级别选择等便利功能。具体操作如下:打开Android Studio,选择”Start a new Android Studio project”。

weixin_42350014的博客 903

一篇文章教你完全掌握jni技术

通过这样一个简单的案例,将大部分jni相关的API都练习了一遍,不难看出,java层能实现的功能,在native层一样可以实现,但这里仅仅是为了练习jni,实际项目中不会把一些无关紧要的功能写在native层,比如UI操作,因为同样的功能,java代码要简洁得太多。在一些拥有复杂算法的场景(音视频编解码,图像绘制等),java的执行效率远低于C/C++的执行效率,使用jni技术,在java层调用C/C++代码,可以提高程序的执行效率,最大化利用机器的硬件资源。的内容,这个取决于实际的需求。

chuyouyinghe的专栏 3360

Android JNI应用与操作实战指南

本文还有配套的精品资源,点击获取 简介:JNI是Java和C/C++代码之间的接口,在Android开发中用于性能优化或重用现有的C/C++库。本指南详细阐述了在Android项目中实现JNI的具体步骤,包括基础介绍、工程创建、本地方法声明、C/C++代码编写、JNI代码编译、本地方法调用、性能优化、错误处理、多线程管理和文件I/O操作等。开发者通过本指南可以学习如何有效地...

weixin_33431149的博客 1876

Android NDK Samples入门指南:JNI基础与Hello-JNI详解

Android NDK Samples入门指南:JNI基础与Hello-JNI详解 【免费下载链接】ndk-samples 项目地址: https://gitcode.com/gh_mirrors/ndks/ndk-sample...

gitblog_00501的博客 584

华三R4900 G5服务器实战:用PMC P460-B4阵列卡配置RAID1+RAID6,并搞定CentOS 7.9安装(含热备盘设置)

本文详细解析了在华三R4900 G5服务器上使用PMC P460-B4阵列卡配置RAID1+RAID6混合阵列的全过程,包括热备盘设置和CentOS 7.9系统安装。通过实战步骤和性能优化建议,帮助企业IT人员高效部署高可用存储方案,特别适合需要数据冗余和系统稳定性的企业级应用场景。

weixin_29248653的博客 357

易灵思FPGA实战:T35F324的PLL硬核配置全流程(附避坑指南)

本文详细解析了易灵思T35F324 FPGA中硬核PLL的配置全流程与核心避坑点。内容涵盖从架构理解、Interface Designer参数设置、VCO范围校验,到时钟网络冲突分析与动态重配置等实战环节,重点解决了引脚分配、资源约束和常见报错问题,为工程师提供了一套清晰可靠的配置指南。

u9v0w的博客 215

Android开发入门教程

无意间发现的,觉得不错就收下了:http://gorgando.com/blog/technology/android_development/awesome-android-tutorials-for-beginners jni:http://antkillerfarm.blog.sohu.com/108484295.html android 学习指南: http://www.apkbus....

mmdev 133

告别虚拟机!用ZYNQ7000和PYNQ 2.6.0打造一个能实时识别人脸的“智能摄像头”

本文详细介绍了如何利用Xilinx ZYNQ7000开发板和PYNQ 2.6.0框架构建实时人脸识别系统。通过硬件加速和嵌入式开发技术,该系统实现了低延迟、低功耗的独立运行能力,适用于边缘计算和物联网应用。文章包含从环境搭建到核心功能实现的完整指南,并提供了性能优化和问题排查的实用技巧。

weixin_42543046的博客 390

【Android學習專題】Android JNI入门实例(Windows+Cygwin+Eclipse)

【Android學習專題】Android JNI入门实例(Windows+Cygwin+Eclipse) SkySeraph Feb 20ty 2012  SZ Email:skyseraph00@163.com    1 基础知识点 ① JNI:Java native interface② Android中调用JNI:static //static区声明的代码会先于onCr...

weixin_33774308的博客 166

ISO15118-20证书结构关系解读(7.3.2.1)

本文主要讲述ISO15118-20:2022标准所有证书结构的关联关系,目的是为后续基于ISO15118-20车桩通讯及PNC充电等提供基础支撑。 本文所有的证书关系图全部来源于ISO15118-20:2022标准规范,在后续的讲解过程会将图的摘取出处给提供出来,便于后期文章和标准对应起来解读。

weixin_40900932的博客 3182

Python+Vue计算机毕业设计风电场监控系统的设计与实现7bd6i(程序+LW+源码+部署)

Python3.7.7+Django+Mysql5.7+pip list+HBuilderX(Vscode也行)+Vue+Pychram社区版。2. 前端:vue+css+javascript+jQuery+easyUI+highcharts。2.IDE环境:Python和Python 社区版都可以。Django + Vue +Python+Mysql 等等组成,B/S模式等等。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。1. 后端:Python、Vue、Django、Mysql。

华信计算机毕设源码程序 340

Android学习之 JNI

一:搭建Android JNI编程的环境 1. Windows环境下Android NDK环境搭建 2.android 的NDK在Windwos环境搭建 3.华清远见Android NDK简介 4.windows系统上安装与使用Android NDK r5 5.NDK与Cygwin配置   二、JNI编程流程 1. android jni 开发流程 2. JNI技术入门 3.

The fucking code 1512

ArcGIS Pro 3.4 二次开发 - 地理数据库

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下,如何操作地理数据库的多种方法。首先,通过路径打开文件地理数据库,并处理可能出现的异常。其次,使用连接属性或sde文件路径打开企业级地理数据库。此外,还展示了如何从项目项、要素图层中获取地理数据库,以及如何执行SQL语句。最后,文章详细说明了如何从地理数据库中获取单个定义或定义列表,包括表定义、要素类定义、关系类定义和要素数据集定义。这些操作均在后台线程中执行,确保应用程序的响应性。

Winemonk 944

Android JNI 基础入门指南

Android JNI 基础入门指南

ljy545733599的博客 1711

【高级】系统架构师 | 2026年上半年案例分析真题

标准答案:系统因缺乏足够历史数据(用户行为、物品信息或评分等),难以做出准确推荐的问题。另外两种:物品冷启动(新课程 / 新知识点缺少互动数据)系统冷启动(平台上线初期整体数据稀缺)类型典型表现常见缓解用户冷启动新注册学员无历史问卷/前测、热门兜底、人口统计学特征、知识图谱前置测评物品冷启动新课无人学无人评内容特征推荐、专家标注、探索流量系统冷启动新平台双边都稀缺规则引擎、运营冷启、知识图谱强约束路径本题已点明「用户冷启动」,另外两种按推荐系统经典三分法作答即可。

大胆尝试,小心实践 358

微信小程序 “net::ERR_CONNECTION_REFUSED” 报错大揭秘与破解之道

在微信小程序开发与运行过程中,“net::ERR_CONNECTION_REFUSED” 报错是开发者常遇难题。该错误意味着小程序与服务器连接建立失败,会导致功能无法使用、数据加载异常等问题,严重影响用户体验和业务运转。本文系统剖析此错误,从网络环境不佳、服务器异常、小程序配置有误等常见触发场景入手,提供网络、服务器、配置、代码等多维度排查步骤,给出针对性解决策略,如修复网络、处理服务器故障、修正配置与代码错误,还提出开发与运维阶段的预防措施,助力开发者高效解决该报错问题。

邓邓子的博客 6131

Java安卓JNI调用C库入门指南

JNI是Java与C/C++之间进行交互的一种技术,它允许Java代码调用本地方法(即C/C++编写的函数),同时也允许C/C++代码调用Java对象和方法。通过JNI,我们可以实现Java与C/C++之间的双向通信,充分利用两种语言的优势。

励志成为一名优秀的全能型软件开发工程师。 1332

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

安卓JNI基础知识

JNI 是java原生接口(Java Native Interface),它定义了 Android 从受管理代码(使用 Java 或 Kotlin 编程语言编写)编译的字节码与原生代码(使用 C/C++ 编写)进行交互的方法,也就是安卓通过JNI技术提供Java调用C/C++或者C/C++调用Java的能力。JNI 不依赖于供应商,支持从动态共享库加载代码,虽然有时较为繁琐,但效率较高。

Watom_663的博客 1259

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Android Studio JNI开发入门教程

概述 在Andorid Studio不支持JNI开发之前大家一般都是使用Eclipse开发JNI,各种配置让人觉得很蛋疼。从Andorid Studio支持JNI开发后,让我们开发JNI变的如此简单。下面我就介绍一下Android Studio开发JNI的全过程,如有不对的地方大家批评指正。 你将学习到什么 什么是NDK和JNI为什么要用JNI做开发如何使用Android Studio开

easyer2012的专栏 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JNI/NDK入门指南之正确姿势了解JNI和NDK

         你真的了解Android中JNI/NDK吗?    随着Android生态的发展,越来越多的行业开始使用Android操作系统,这就造就了对Android设备的应用性能和安全要求越来越高,随之而来的对JNI/NDK开发的需求也越来越大。虽然网上或者很多书籍都有关于此方面的讲解,但是都是上来直奔主题说怎么使用JNI/NDK,而没有将啥是JNI和NDK讲解清楚。所以导致很...

IT先森 3569

Android中的JNI技术

JNI,全名 Java Native Interface,Java代表的使java语言,Native代表当前程序运行的本地环境,一般是Windows和Linux,这些操作系统都是通过C/C++实现的,所以Native通常也指C/C++语言,Interface代表java跟native两者之间的通信接口,JNI可以实现java和C/C++通信。Java虽然跨平台,但仍然运行在具体平台(windows,linux)之上,对于需要操作硬件的功能,必须通过系统的C/C++方法对硬件进行直接操作;

sky_1305995351的博客 1648
上一篇: 重学 Android 自定义 View 系列(三):自定义步数进度条
下一篇: 安卓属性动画插值器(Interpolator)详解
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值