JNI

Android 之 JNI 开发 详解

自古美人都是妖i 提交于 2019-12-02 18:50:16
NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git 一. JNI介绍 1. JNI引入 JNI概念 : Java本地接口, Java Native Interface , 它是一个 协议 , 该协议用来沟通Java代码和外部的本地C/C++代码, 通过该协议 Java代码可以调用外部的本地代码, 外部的C/C++ 代码可以调用Java代码; C和Java的侧重 : -- C语言 : C语言中最重要的是 函数 function; -- Java语言 : Java中最重要的是 JVM, class类, 以及class中的方法; C与Java如何交流 : -- JNI规范 : C语言与Java语言交流需要一个适配器, 中间件, 即 JNI, JNI提供了一种规范; -- C语言中调用Java方法 : 可以让我们在C代码中找到Java代码class中的方法, 并且调用该方法; -- Java语言中调用C语言方法 : 同时也可以在Java代码中, 将一个C语言的方法映射到Java的某个方法上; -- JNI桥梁作用 : JNI提供了一个桥梁, 打通了C语言和Java语言之间的障碍; 2. Android中的应用程序框架 正常情况下的Android框架 : 最 顶层 是

eclipse 编译jni的一些设置

[亡魂溺海] 提交于 2019-12-02 18:11:34
最近帮人跟踪问题时,发现他们buildjni代码时,要么在linux下要么在cygwin下,敲一堆指令,进一堆目录,甚至还在linux和windows之间切换系统, 着实麻烦。 在网上找了找,有人贴了一些在eclipse里编译的办法,这里总结一下 首先需要安装cygwin,不用勾选太多的内容。 在select packages里面搜索autoconf2.1、automake1.10、binutils、gcc-core、gcc-g++、gcc4-core、gcc4-g++、gdb、pcre、libpcre-devel、gawk、make。 然后一路next安装完成即可。 eclipse-Project-Properties-Builders-New-Program Arguments输入 --login -c "cd $(cygpath -u '${build_project}') && pwd && $NDK/ndk-build" build_project是Eclipse里面自带的工程路径,因为是windows风格的路径,需要用cygpath转换成cygwin的相对路径 NDK是cygwin里面设置的android ndk的路径 NDK=/cygdrive/e/Android/android-ndk-r7 #对应windows的e:\Android\android-ndk-r7

每周总结20130814——Android NDK环境的搭建和使用,YUV420SP格式图像的处理

十年热恋 提交于 2019-12-02 16:51:17
Windows下搭建Android NDK开发环境 更新:比较新的版本的Android NDK都自带基本的GNU工具链,所以不用安装庞大的cygwin或者MSYS了,直接解压NDK然后在Eclipse里配置编译器就可以了。 ———————————————————————————————————— Android NDK需要使用Linux下的make、gdb等开发工具,因此要安装一个模拟的Linux环境。这里选择最常用的cygwin。MSYS应该也可以,不过没有亲自试过,留给有求证精神并鄙视cygwin的庞大和缓慢的Coder去验证! cygwin有自己的安装器,相当于Linux发行版下的包管理器,用来管理软件。打开后选择从网络安装,选择一个合适的镜像,偷懒的话直接把Devel分类下的软件全部选上,点击下一步后这个包管理器会自己解决各种乱七八糟的依赖关系,给你下载安装几个G的软件包。如果有洁癖或者网络不给力,可以自己慢慢选择要装哪些软件,这样装的东西会少很多。顺便吐槽一句,cygwin的这个图形化包管理器体验真是渣,快装完的时候有个选项没看清,手贱点了一下上一步,我再次点击下一步的时候它就给我卸载又重新安装配置了一遍,于是又多花了十几分钟。。。有没有省事点的像aptitude这样牛气哄哄的工具? 装完cygwin后还要简单地配置一下。首先请下载最新版本的Android NDK并解压

C/C++ JNI 调用java

余生颓废 提交于 2019-12-02 08:15:25
1. 用C++实现Java类中的方法: 在java中声明的JNI的静态方法(native static)和非静态方法,对于底层的C/C++代码来说是有区别的: JNI函数的参数也由三部分组成:首先是JNIEnv*,是一个指向JNI运行环境的指针; 第二个参数随本地方法是静态还是非静态而有所不同一一非静态本地方法的第二个参数是对对象的引用,而静态本地方法的第二个参数是对其Java类的引用; 其余的参数对应通常Java方法的参数,参数类型需要根据一定规则进行映射。 2. 在C++代码中调用Java类中的方法: jclass clazz = NULL; JNIEnv* env = NULL; //1、JNI回调静态方法: 不需要对象实例,只需要拿到class即可 void jniCallUnStaticMethod() { getJNIEnv(&env); clazz = env->FindClass("com.test.Test"); jmethodID method = env-> GetStaticMethodID (clazz, "staticTestMethod", "(I)V"); env-> CallStaticVoidMethod (clazz, method, channel); } //2、JNI回调非静态方法: 需要class及其一个实例,可通过如下方式注册一个实例

Android JNI回调java接口方法学习

a 夏天 提交于 2019-12-02 08:15:17
代码主要分为Java层(java代码)和JNI层(c语言代码),首先看看Java层的代码(Native.java)。 如上所示,Java层与JNI层的接口代码主要封装在Native类中,该类定义了三个native函数,分别完成jni库的初始化,调用jni层开启线程,调用jni层关闭线程等功能。并且提供一个回调函数(onNativeCallback),供jni层调用,并在回调函数中打印count的值。 再看看JNI层是如何开启线程并回调Java层的(native.c),关键的地方都在代码中进行了注释: 1. 头文件包含和全局变量的定义 2. 初始化函数的实现 3. 开启关闭线程的实现 4. 线程的实现(关键) 由上述代码可以看到,JNI层通过pthread库完成了线程的创建,需要特别注意的是,JNI层的线程中,必须通过全局的JavaVM来获取到环境变量,也必须通过全局的jobject获取java类对象,从而找到java端的函数,进行回调。 1. 在onload的时候保存JavaVM指针。 2. 在自定义jni方法里(该方法须在callback方法使用前调用,例如初始化方法)保存callback方法所在对象, 且该对象需要创建一个全局引用以便在线程方法里使用,默认是local ref,函数执行完会被虚拟机释放; 另外自定义jni方法和callback方法在同一个类里

JNI(Java Native Interface)

情到浓时终转凉″ 提交于 2019-12-02 06:40:42
1.什么是JNI: JNI(Java Native Interface):java本地开发接口 JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(c/c++) 外部的c/c++代码也可以调用java代码 2.为什么使用JNI: 效率上 C/C++是本地语言,比java更高效 代码移植,如果之前用C语言开发过模块,可以复用已经存在的c代码 java反编译比C语言容易,一般加密算法都是用C语言编写,不容易被反编译 3.Java基本数据类型与C语言基本数据类型的对应 4.引用类型对应 4.1堆内存和栈内存的概念 栈内存: 系统自动分配和释放,保存全局、静态、局部变量,在站上分配内存叫静态分配, 大小一般是固定的。 堆内存: 程序员手动分配(malloc/new)和释放(free/java不用手动释放,由GC回收),在堆上分配内存叫动态分配, 一般硬件内存有多大堆内存就有多大。 交叉编译 1、交叉编译的概念 交叉编译即在一个平台,编译出另一个平台能够执行的二进制代码 主流平台有: Windows、 Mac os、 Linux 主流处理器: x86、 arm、 mips 2、交叉编译的原理 即在一个平台上,模拟其他平台的特性 编译的流程: 源代码-->编译-->链接-->可执行程序 3、交叉编译的工具链 多个工具的集合,一个工具使用完后接着调用下一个工具 4、常见的交叉编译工具

Ubuntu下JNI的hello world

橙三吉。 提交于 2019-12-02 06:11:52
1、创建一个java文件(HelloWorld.java)。 [java] view plain copy class HelloWorld { static { System.loadLibrary( "HelloWorld" ); } private native void print(); public static void main(String args[]) { new HelloWorld().print(); } } 2、使用javac命令编译该java文件,在终端输入"javac HelloWorld.java"。生成HelloWorld.class. 3、使用javah命令生成头文件。在终端输入"javah -jni HelloWorld", 生成HelloWorld.h 4、使用本地方法实现头文件中的方法。 [cpp] view plain copy #include <jni.h> #include <stdio.h> #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_print (JNIEnv *env, jobject obj) { printf( "HelloWorld JNI!/n" ); return ; } 5、用gcc编译生成so文件。 gcc -shared -I

jni连接dll报错

别来无恙 提交于 2019-12-02 05:02:19
jni连接dll报错 用了2个月好好的今天突然出现这个问题 Execution protection violation #A fatal error has been detected by the Java Runtime Environment: EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000, pid=8668, tid=1768 #JRE version: Java™ SE Runtime Environment (8.0-b132) (build 1.8.0-b132) #Java VM: Java HotSpot™ Client VM (25.0-b70 mixed mode, sharing windows-x86 ) #Problematic frame: #C 0x00000000 #Failed to write core dump. Minidumps are not enabled by default on client versions of Windows #An error report file with more information is saved as: #D:\hotelsystem\hs_err_pid8668.log #If you would like to

android app中使用JNI

醉酒当歌 提交于 2019-12-02 00:58:18
JNI提供了一种机制,使得在Java 代码中可以使用 C/C++ 的本地层代码,这种使用主要是指在 Java 代码中调用 C/C++ 代码。这种机制为我们开启了一扇门,一扇将Java 代码与广阔的 C/C++ 本地层连接起来的门。 基于 android-ndk-r8d 提供的sample 程序——android-ndk-r8d/samples/hello-jni 的代码,我们来看一下,如何在 android 应用开发中使用 JNI。 首先来看在 Java 代码中需要做些什么事情: package com.example.hellojni; import android.app.Activity; import android.widget.TextView; import android.os.Bundle; public class HelloJni extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* Create a TextView and set its content. * the text

Java JNI机制

僤鯓⒐⒋嵵緔 提交于 2019-12-01 14:03:43
java JNI机制 JNI概述及简单例子介绍 系统环境代指本地操作系统环境,它有自己的本地库和CPU指令集。本地程序(Native Applications)使用C/C++这样的本地语言来编写,被编译成只能在本地系统环境下运行的二进制代码,并和本地库链接在一起。本地程序和本地库一般地会依赖于一个特定的本地系统环境。比如,一个系统下编译出来的C程序不能在另一个系统中运行。 JNI的强大特性使我们在使用JAVA平台的同时,还可以重用原来的本地代码。作为虚拟机实现的一部分,JNI允许JAVA和本地代码间的双向交互。 JNI可以这样与本地程序进行交互: 你可以使用 JNI 来实现"本地方法"( native methods ),并在 JAVA 程序中调用它们。 JNI 支持一个"调用接口"( invocation interface ),它允许你把一个 JVM 嵌入到本地程序中。本地程序可以链接一个实现了 JVM 的本地库,然后使用"调用接口"执行 JAVA 语言编写的软件模块。例如,一个用 C 语言写的浏览器可以在一个嵌入式 JVM 上面执行从网上下载下来的 applets 使用JAVA程序调用C函数打印"Hello World!"。这个过程包含下面几个步骤: 创建一个类( HelloWorld.java )声明本地方法。 使用 javac 编译源文件 HollowWorld.java