JNI

用 JNI 进行 Java 编程(3)

我的梦境 提交于 2019-11-29 15:41:03
从 C/C++ 程序调用 Java 代码 概述 JNI 允许您从本机代码内调用 Java 类方法。要做到这一点,通常必须使用 Invocation API 在本机代码内创建和初始化一个 JVM。下列是您可能决定从 C/C++ 代码调用 Java 代码的典型情况: 希望实现的这部分代码是平台无关的,它将用于跨多种平台使用的功能。 需要在本机应用程序中访问用 Java 语言编写的代码或代码库。 希望从本机代码利用标准 Java 类库。 从 C/C++ 程序调用 Java 代码的四个步骤 从 C/C++ 调用 Java 方法过程的四个步骤如下: 编写 Java 代码 。这个步骤包含编写一个或多个 Java 类,这些类实现(或调用其它方法实现)您想要访问的功能。 编译 Java 代码 。在能够使用这些 Java 类之前,必须成功地将它们编译成字节码。 编写 C/C++ 代码 。这个代码将创建和实例化 JVM,并调用正确的 Java 方法。 运行本机 C/C++ 应用程序 。将运行应用程序以查看它是否正常工作。我们还将讨论一些用于处理常见错误的技巧。 步骤 1:编写 Java 代码 我们从编写一个或多个 Java 源代码文件开始,这些文件将实现我们想要本机 C/C++ 代码使用的功能。 下面显示了一个 Java 代码示例 Sample2.java: public class Sample2

NDK开发 eclipse相关开发环境的搭建

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-29 03:47:04
开发环境:windows+eclipse+NDK+cygwin (推荐这个偶然发现的音乐,听着心情就会变好) 在《android初涉NDK,从零打造你的第一个demo》( http://my.oschina.net/sosofy/blog/78353 ) 中,我把打造第一个jni相关demo的过程大致介绍了一下,因为该工程的功能也好,代码也好都是非常非常浅显易懂的,所以用notePad++之类的文本编辑工具就能直接写好。但是如果当native code的逻辑非常复杂,代码工作量也非常之大的话,不是大神并且刚刚开始接触JNI开发的你我在不借助IDE的情况下,想必十分DT。好在eclipse中也不少好用的插件帮助我们解决这一难题。 废话说完,进入正题。首先是CDT插件的安装,官方地址: http://www.eclipse.org/cdt/downloads.php 。 在该页面找到你需要的版本下载安装(PS:貌似该网页提供的在线安装的地址失效Orz,所以还是下到本地安装吧)。安装完成之后,我们现在就可以用eclipse写c/c++代码了(熟悉vs开发环境的童鞋可能需要适应一下)。在上次的demo中,我们是单独编写JNI相关代码然后编译得到so文件,在拷贝到android工程中,这个过程有点繁琐,有时可能还会忘记,尤其是在以后调试的时候,反复地重复该过程会让人崩溃吧!在安装了CDT后

Javah提示未找到 ..的类文件

試著忘記壹切 提交于 2019-11-28 22:51:55
D:\我的文档\workspace\PrepareForExam\src>javah -classpath D:\我的文档\workspace\ PrepareForExam\src\com\example\myclass -d d:/ -jni com.example.myclass.jni_test 错误:无法访问 com.example.myclass.jni_test 未找到 com.example.myclass.jni_test 的类文件 javadoc: 错误 - 找不到类 com.example.myclass.jni_test。 Error: 未在命令行中指定任何类 。请尝试使用 -help。 本来想用javah生成java调用C语言用的头文件的,没想到使用上一直受挫。在这里简单地介绍以下javah的使用 假设我们已经有了这个类,准备用它生成调用C语言的头文件。另外,这个Java文件是在路径“D:\我的文档\workspace\PrepareForExam\scr”下,包“package com.example.myclass;”中的 package com.example.myclass; public class jni_test { private native final void init(); private native final void

JNI学习笔记

五迷三道 提交于 2019-11-28 22:29:49
Java类型 本地类型 JNI中定义的别名 int long jint long _int64 jlong byte signed char jbyte boolean unsigned char jboolean char unsigned short jchar short short jshort float float jfloat double double jdouble Object _jobject* jobject jclass cls = (*env)->FindClass(env, "Lpackagename/classname;" ); //创建一个class的引用 jmethodID id = (*env)->GetMethodID(env, cls, "" , "(D)V" ); //注意这里方法的名称是"",它表示这是一个构造函数,而且构造参数是double型的 jobject obj = (*env)->NewObjectA(env, cls, id, args); //获得一实例,args是构造函数的参数,它是一个jvalue*类型。 类型 符号 boolean Z byte B char C short S int I long L float F double D void V object对象 LClassName; L类名; Arrays

android jni回调 转自http://android.wooyd.org/JNIExa...

混江龙づ霸主 提交于 2019-11-28 22:21:46
Important notice<注意> The instructions in these document are applicable to older Android firmwares. Starting with firmware version 1.5 the Android NDK has been released, which makes it much easier to deal with native code. If you are coding for firmware 1.5 or newer, it is strongly recommended to use Android NDK instead of following this guide. JNI Examples for Android Jurij Smakov jurij@wooyd.org Table of Contents Licence Introduction Java interface Native library implementation Headers and global variables Calling Java functions from Java and native threads Implementation of other native

[深入理解Android卷一全文-第四章]深入理解zygote

社会主义新天地 提交于 2019-11-28 20:28:10
由于《深入理解Android 卷一》和《深入理解Android卷二》不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在OSC博客中全文转发这两本书的全部内容。 第4章 深入理解Zygote 本章主要内容 · 深入分析zygote,并介绍system_server进程的初始化工作。 本章涉及的源代码文件名及位置 下面是我们本章分析的源码文件名及其位置。 · App_main.cpp framework/base/cmds/app_process/App_main.cpp · AndroidRuntime.h framework/base/include/android_runtime/AndroidRuntime.h · android_debug_JNITest.cpp framework/base/core/jni/android_debug_JNITest.cpp · ZygoteInit.java framework/base/core/java/com/android/internal/os/ZygoteInit.java · dalvik_system_Zygote.c dalvik/vm/native/dalvik_system_Zygote.c · RuntimeInit.java framework/base/core/java/com/android

如何为Android,Mac和Windows平台创建Java JNI动态链接库

巧了我就是萌 提交于 2019-11-28 20:27:34
Java Native Interface (JNI) 是Java和C/C++之间的桥梁。在一些情况下,为了提高Java程序的性能,扩展Java程序的功能,我们需要使用JNI。比如数据库的调用,当我们下载一个JDBC的jar包之后,解压可以看到里面包含了不同平台的动态链接库: 这篇文章介绍如何为Android,Mac和Windows平台,创建一个最简单的JNI动态链接库。 参考文章: Getting Started with JNI on Android, Windows and Mac Android 下载NDK,并在Eclipse中配置路径: 创建一个Android工程 hellojni 。右键工程,选择 Add Native Support自动 生成C/C++工程: 修改C/C++代码,配置一下Android.mk: 点击保存就会自动生成动态链接库 libhellojni.so 。你也可以通过命令 ndk-build 手动生成: Windows 打开Visual Studio,创建一个Win32工程 hellojni: 在应用类型中选择DLL: 配置头文件和库的路径: 点击build就可以生成 hellojni.dll : Mac OS X 打开Xcode,创建一个工程 hellojni : framework选择STL: 在build设置里,配置 JavaVM

[Android] 环境配置之Android Studio开发NDK

戏子无情 提交于 2019-11-28 20:27:24
======================================================== 作者:qiujuer 博客: my.oschina.net/u/1377710 网站: www.qiujuer.net 开源库: Genius-Android 转载请注明出处: http://my.oschina.net/u/1377710/blog/359000 ======================================================== NDK 开发哪家强?XX XX 找 Blue Fly . 说到 NDK 开发,其实是为了有些时候为了项目需求需要调用底层的一些 C/C++ 的一些东西;另外就是为了效率更加高些。 但是很多时候能不用就不用;这个是啥原因?个人感觉有些时候是觉得麻烦, 首先要配置 NDK 还要 下载 Cygwin ,配置 Cygwin ,然后需要编译生成 ,哎太麻烦了。如果你说使用 Eclipse ,的确这样在编译上是能简单很多,但是前期也是需要配置一大堆;哎,配置错了还伤不起。 现在谷歌主力推动 Android Studio 这个是个不错的工具,至少现在来看在 Eclipse 上能做到的 这边都有,这边有的 Eclipse 上不一定有。 下面来说说 在 Android Studio 中怎么进行 NDK 的开发。

JNI 之二 :java & c/c++ 相互通信及调用

回眸只為那壹抹淺笑 提交于 2019-11-28 20:23:32
JNI是Java Native Interface的缩写,JNI是一种机制,有了它就可以在java程序中调用其他native代码,或者使native代码调用java层的代码。也就是说,有了JNI我们可以使Android项目中,java层与native层各自发挥所长并相互配合。 JAVA | | JNI | | NATIVE JNI相对与native层来说是一个接口,java层的程序想访问native层,必须通过JNI,反过来也一样。 1,如何告诉VM(虚拟机)java层需要调用native层的哪些libs? 我们知道java程序是运行在VM上的,而Native层的libs则不然。所以为了让java层能访问native层的libs,必须得告诉VM要使用哪些native层的libs。下面看一段代码 [java] view plain copy public class MediaPlayer { ... static { System.loadLibrary( "media_jni" ); native_init(); } ... private native final void native_setup(Object mediaplayer_this); ... } 可以看到上面的代码中,在MediaPlayer类中有一段static块包围起来的代码,其中System

浅谈Java的本地方法实现JNI

十年热恋 提交于 2019-11-28 13:55:42
最近做了一个数据结构课上迷宫求解的问题,要求在栈结构上最好能带一个图形界面,将找到的迷宫路径展示出来。原本打算连图形界面一起用C语言写,但是C语言的图形界面如果不调用操作系统的图形库真的很难看,所以选择了Java写图形界面,C语言写算法的这样一个混合编程的方案。这里不对Java图形界面的具体实现和C的算法做解释,只介绍Java和C的“连接部分”。 使用本地方法的前提 虽然现在Java的执行效率的确得到了很大的提升,但是一旦遇到大量计算操作时,还是不如C语言执行快。这种情况下,我们可以考虑将关键的算法部分交给C语言去处理,而其余的部分由Java处理。 Java部分 Java中应对C语言中预期的函数进行声明,这里规定使用native关键字,如: public static native void something(); 采用这种native声明的方式,告知JVM这个方法的定义和具体实现在外部完成,JVM只负责唤醒这个C函数;之后编译这个文件。而在所有操作都完成后,还要向文件中添加static标记的域,如: static{ System.loadLibrary(“Something”); } 然后再重新编译。前后总共编译两次。 C部分 至于C部分,因为是要让JVM调用C程序,所以首先要保证JVM能识别C程序——又因为JVM能识别的是Java格式