JNI

JNI调用C和C++存在的区别

a 夏天 提交于 2019-11-28 07:14:34
JNI调用C和C++存在的区别 JNI是由C语言定义接口的,JNI通过函数名找函数入口,执行函数里的内容。这和函数用什么语言生成的并没有关系。只要保证函数名称符合JNI的协议。而使用C++要注意的是C++默认生成的函数名称和你写在源文件中的名称并不相同,因为C++要处理函数重载,会在函数名称中加上参数信息,这称为name mangling。解决方法是定义函数时在前面加上extern "C"修饰,告诉编译器这函数要被C调用(当然,其实是JNI)。本质没有什么区别,一个是JNI调C,一个是JNI调C,C再掉C++,这样理解就简单了~ 在C的定义中,env是一个两级指针,而在C++的定义中,env是个一级指针。C形式需要对env指针进行双重deferencing,而且须将env作为第一个参数传给jni函数,举个简单的例子: eg: 对于XXX.c:JNI 函数调用由“(*env)->”作前缀,目的是为了取出函数指针所引用的值。 return (*env)->NewStringUTF(env,"HelloJNI!"); 对于XXX.cpp:JNIEnv 类拥有处理函数指针查找的内联成员函数。 return env->NewStringUTF("HelloJNI!"); 可以发现,C或者C++的实现很类似,但是它们对env的操作方式有所不同,因此使用C和C++来实现同一个JNI方法

Android JNI和NDK关系

痞子三分冷 提交于 2019-11-27 23:03:05
1、什么JNI Java Native Interface(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机(VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。 上面过程分为2个部分: 第一、用C语言生成一个库文件。 第二、在java中调用这个库文件的函数。 2、NDK NDK全称:Native Development Kit。 NDK是一系列工具的集合。 * NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。 * NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。 * NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。 个人理解,NDK就是能够方便快捷开发.so文件的工具。 JNI的过程比较复杂,生成.so需要大量操作,而NDK就是简化了这个过程。 3、java中调用.so文件代码 其中,在java中加载库文件的代码如下: System.loadLibrary(*.so的档案名); 例如

史上最强NDK入门项目实战

只愿长相守 提交于 2019-11-27 23:02:47
目标: 利用NDK生成SO库,使用SO库进行JNI调用,在Android sdcard创建文件并写入数据。 工具: NDK1.5 R1, android SDK1.5 R1, SDCARD, Eclipse , ADT 0.9, Eclipse Galileo for C/C++, Cygwin 1.5。 工具比较多,我是在Windows XP进行操作的,如果在Ubuntu或者其他的Linux系统下进行操作直接进入步骤2即可。请看步骤: 1. 安装Cygwin 关于Cygwin的安装请自行百度或者google,因为网速原因,建议大家使用本地安装包进行下载: http://www.gougou.com/search?search=cygwin&id=2 下载一个38.2M 即可,我用的就是这个版本。 2. 安装NDK 进入正题安装NDK,首先打开cygwin,然后使用cd命令进入你的NDK根目录,(不会用linux命令??Google去),然后运行:build/host-setup.sh 如果出现以上的信息,说明安装正确,如果出现GCC为找到,请输入gcc命令查看,如果出现toolchain未找到的信息,请试着修改build/host-setup.sh文件第一行代码, 将:#!/bin/sh 改成#!/bin/bash, 在Ubuntu上这个是需要修改的 安装成后

使用Javah 生成C/C++头文件

故事扮演 提交于 2019-11-27 20:35:53
使用Javah 可以获取您的 Java 源文件并生成 C/C++头文件,其中包含您的 Java 代码中所有本地方法(native方法)的 JNI 存根(stub,C头文件)。如果您正在生成一个类的 JNI 存根,而且您已经把这个类定义为包的一部分,那么您 必须指定完全限定的类名。 下面举例说明: 使用eclipse建立一个工程假设工程路径为$ProjectPath,并且你已经定义了一个类,并且带包名:cn.com.comit.jni 1 package cn.com.comit.jni; 2 3 public class HelloJni { 4 5 public native void displayHelloJni(); 6 static{ 7 System.loadLibrary(""); 8 } 9 10 /** 11 * @param args 12 */ 13 public static void main(String[] args) { 14 // TODO Auto-generated method stub 15 new HelloJni().displayHelloJni(); 16 } 17 18 } eclipse会自动帮你编译出一个字节码文件HelloJni.class,路径是$ProjectPath\bin\cn\com\comit\jni

JNI在eclipse中出现Unresolved inclusion: <jni.h>或Type 'jint' could not be resolved等解决方法

北城余情 提交于 2019-11-27 17:08:19
在eclipse中经常出现这类错误,include文件报错或者是jint,jclass,JNIEnv could not be resolved等,但可以编译通过,可以经过这个步骤消除这些错误或警告 1. 打开.project,删除cdt部分 <buildSpec> <buildCommand> <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> <triggers>clean,full,incremental,</triggers> <arguments> </arguments> </buildCommand> <buildCommand> <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name>

JAVA JNI调用C++算法步骤

こ雲淡風輕ζ 提交于 2019-11-27 14:24:29
JAVA JNI调用C++算法步骤 1、创建一个Java程序(HelloWorld.java) package com.xiaomo.jni; public class HelloWord { public native void sayHello (String string ); static { System. out .println(System.getProperty( "java.library.path" )); //后文放.dll库或者.so 库要用到这个路径 System.loadLibrary( "HelloWordSO" ); //linux调用.so库;windows调用.dll库 } public static void main (String[] args) throws InterruptedException { HelloWord jni = new HelloWord(); jni.sayHello( "hello liu" ); } } 2、用javac编译HelloWorld.java生成HelloWorld.class。 javac com /xiaomo/jni/JNITest .java 3、用javah编译HelloWorld.class生成HelloWorld.h头文件,后文c++调用这个头文件 javah com

Android JNI MAC OS环境配置

左心房为你撑大大i 提交于 2019-11-27 14:22:54
Android JNI MAC OS环境配置 http://whbzju.github.io/blog/2013/06/01/android-jni-config/ JUN 1ST, 2013 | COMMENTS 前言—JNI技术简介 JNI是Java Native Interface的缩写,即“Java本地调用”,它是Java世界和Native世界的中介桥梁。其中Native世界一般指C/C++的世界。众所周知,Java是一种跨平台的语言,即Java编写的应用与平台无关。但是,计算机的世界在Java出现之前已经发展了很久,有很多优秀健壮的代码可以复用。比如Linux下的好多驱动模块、文件系统等。Java若去重新实现这些功能,未免费力不讨好,落下重复造轮子的名声。通过JNI技术,使用这些Native的模块,便成了一个折中的办法。同时,Java的世界依靠虚拟机构建,而虚拟机是native语言实现,并且虚拟机运行在具体的平台上,所以虚拟机本身是无法做到平台无关。通过JNI技术,可能做到在Java层的平台无关,即在Java层,底层的细节完全被屏蔽掉了。综合来讲,JNI技术一直支撑这Java世界,只不过我们平时接触的较少。 在Android的世界里,不允许纯C/C++的程序出现,但是它支持JNI,通过JNI来实现java和C/C++的交互。因此,JNI对于需要接触到Android源码

在Native code中访问java 对象(I)

跟風遠走 提交于 2019-11-27 14:20:23
打通了连接Java世界和native世界的通道之后,摆在我们面前的问题,就变为了,如何在native code中,来操作Java object呢?Java object可以分为如下3种: Java Language的基本数据类型,或称为原始数据类型 Java Language中内置的引用数据类型,如String,基本数据类型的数组 非Java Language内置的引用数据类型 Java Language的基本数据类型,与C/C++中的那些基本数据类型并无太大的差别,无论是作为参数传递,还是要作为返回值 。因而此处,对于 Java Language的基本数据类型就不再多做描述。下面主要说明一下在native code中访问 Java Language中内置的引用数据类型 和 非Java Language内置的引用数据类型。 Java Language中内置的引用数据类型 Java Language中内置的引用数据类型,又主要包括String和原始数据类型的数组。 String 首先来看String 。String所对应的native 类型为jstring。jstring既不同于C风格的一‘\0’结尾的char *的string,也不同于C++标准库中的string类型。我们不能像操作C风格的string那样来操作jstring,而必须首先经过JNI函数的转换,转换为UTF

android jni生成so

…衆ロ難τιáo~ 提交于 2019-11-27 07:24:24
环境配置 进入android studio->setting->external Tools,创建Group命名NDK 命名1 name:javah,description:javah, Program:$JDKPath$\bin\javah.exe, Parameter:$FileClass$ Working directroy:$ModuleFileDir$\src\main\java 命名2 name:ndk-build,description:ndk-build, Program(本地ndk路径,没有的话需下载):xxxxx\ndk-build.cmd, Parameter:空 Working directroy:$ModuleFileDir$\src\main 创建好之后选中项目右击会出现NDK选项指向javah和ndk-build 配置文件创建 1、main下新建jni目录 2、在项目目录下新建MyJni.java:例如 public class MyJni { static { System.loadLibrary("MyJni"); } public native static String getString(); } 3、选中MyJni右击选NDK->javah生成 MyJni.h并放入jni目录下 6、jni目录下根据MyJni.h创建Test.c文件:例

JNI使用笔记

给你一囗甜甜゛ 提交于 2019-11-27 05:59:55
想用JNI做个java的console清屏接口 第一步,编写java工具类 public class Window { // 声明要调用的native方法 public native void clear(); public static void main(String[] args) { System.loadLibrary("Project1"); new Window().clear(); } } 第二步,编译生成字节码 javac -encoding utf-8 Window.java 第三步,生成对应的头文件 javah Window 第四步,用vs2017新建一个空的DLL项目(我用了默认的名字Project1😅) 第五步,将生成的Window.h 以及 %JAVA_HOME% 目录下的include文件夹中的Jni.h 和 win32下的jni_md.h 共三个头文件复制到刚才新建的DLL项目源文件目录下 (如果jni.h找不到,就将<>换成"") 第六步,在vs项目中新建一个类,名字随意 第七步,右键解决方案,配置属性配置一下 第八步,生成解决方案 第九步,找到dll文件,放到jdk的bin目录下 最后一步,调用 运行刚才的代码,over。 来源: https://blog.csdn.net/wanbeila/article/details/99477524