JNI

JNI --&-- JNA

别来无恙 提交于 2019-11-30 20:05:31
最近写SDK,解释下什么是SDK,SDK一般是一些被 软件工程师 用于为特定的 软件包 、软件框架、硬件平台、操作系统等建立 应用软件 的开发工具的集合。开发SDK时使用JNI去调用SO或DLL是一件多么痛苦的事情啊,痛苦的让我有点想去学C的冲动。首先来解释下SO和DLL吧,SO和DLL是使用C语言来写的一个共享库。下面说说使用JNI和JNA的具体步骤吧: 首先是让人灰常头痛的JNI: 一:生成NativeJNIHelloWord.java文件 public class NativeJNIHelloWord{ public native void displayHello(); static{ System.out.println("hello"); } static{ System.load("xx.so"); /* 加载so或dll,System.load2.System.load 参数为库文件的绝对路径,可以是任意路径。 例如你可以这样载入一个windows平台下JNI库文件: System.load("C:\\Documents and Settings\\TestJNI.dll");。 3. System.loadLibrary 参数为库文件名,不包含库文件的扩展名。 例如你可以这样载入一个windows平台下JNI库文件 System. loadLibrary (

Android Studio 使用NDK编译jni

落爺英雄遲暮 提交于 2019-11-30 10:50:52
试用了Android Studio一段时间,发现这东西不支持C/C++,而且创建工程也只能创建Android的工程.这可苦恼死我了.... 网上找了找,大多人都说是AndroidStudio和Eclipse之间来回切换..这不悲剧吗? 在AndroidStuido的Setting-Plugins中发现有C/C++的插件,安装后发现自己能力有限,不会玩这东西.. 每次要打开C文件点击Tools-Cpp Support-Do compile for selected c/c++ file to compile.才能编译 编译过程发现有这样一个文件"C:\Users\Administrator.Mutour-pc\.AndroidStudioPreview\system\tmp\gcc4139693535478647149.bat" 打开 发现很简单的几句话: set PATH=$PATH$;c:\cygwin\bin gcc 很显然,编译失败......... 想到Eclipse中编译NDK时的设置 " http://my.oschina.net/mutour/blog/98535 " 修改该文件如下:(其实跟命令行编译一样...) set PATH=$PATH$;E:\cygwin\bin bash.exe --login -c "cd $(cygpath -u 'E:

NDK使用OpenCV2.4.2本地代码

泪湿孤枕 提交于 2019-11-30 05:58:38
本文讲述Android NDK中使用OpenCV2.4.2的详细过程(不使用OpenCV的java封装) 1. 前期准备: a. 下载 opencv-android-sdk ,解压;(或者可以从OpenCV源代码自己编译,先设置ANDROID_NDK变量,然后使用cmake -DCMAKE_TOOLCHAIN_FILE=...,即可编译arm平台下的opencv库,生成的文件同下载的android-sdk是一样的) b. 配置好Android开发环境和NDK环境; 2. 开始整合: a. 新建android工程,声明native方法,生成头文件,创建cpp源文件: #include "com_tristan_first_demo_Util.h" #include <opencv2/opencv.hpp> #include <vector> using namespace std; using namespace cv; JNIEXPORT void JNICALL Java_com_tristan_first_demo_Util_test (JNIEnv *env, jclass object) { Mat image = imread( "/ sdcard /lena.jpg" ); if (!image.data) { return ; } Mat dest(image

OpenCV4Android+JNI开发快速上手入门

安稳与你 提交于 2019-11-30 05:57:52
最近尝试了一下在Android上试验简单的一些OpenCV算法,发现OpenCV4Android SDK非常好用,提供大部分常用的OpenCV功能的Java API。当然如果直接对图像像素进行操作的话Java会比较没有效率,这时可以对部分关键功能使用ndk和jni进行native的C++实现。有了这套SDK和简单的JNI接口,像我这样不懂安卓开发的人也可以在手机上尝试各种好玩的算法了。 这个入门假定你已经比较熟悉OpenCV的使用,所以主要针对安卓工程的创建和配置。 (本文为 cvnote.info 原创,转载请注明出处,同时欢迎关注新浪微博@ cvnote ) 安卓开发环境与OpenCV的配置 安卓的开发环境我用的是 ADT Bundle (http://developer.android.com/sdk/installing/bundle.html),这是一套已经配置好的用于安卓开发的Android SDK及eclipse环境,下载之后放在一个目录直接运行eclipse即可,非常方便。 OpenCV方面因为我们可能即要使用OpenCV4Android的Java API,又想要在JNI中用C++调OpenCV库实现一部分功能,所以OpenCV本身的C++库和OpenCV4Android SDK都要安装。 OpenCV本身的库的安装网上资料很多,另外如果是linux的话也可以参考《

Android NDK开发环境搭建

徘徊边缘 提交于 2019-11-30 04:52:53
/* http://my.oschina.net/lifj/blog/176916 */ 有人说,网上的环境配置一大堆,你还写做什么? 一来 ,是我再次复习的材料。 二来 ,网上有些地方说的不是很详细,我也是参考了好多资料,弄了半天才弄好环境。写下来,帮助后面的人省掉不必要的麻烦。下面进入正题。 作为一个2年的android攻城狮,今天才开始学习NDK的开发,太晚了。。毕竟是现用现学。学完还是写个博客记下来比较好,省的以后再忘记,又得重新来过。下面 正式进入正题(难道上面都是说着玩玩的? ) 。 能看到NDK开发的人,应该android最基本的开发环境(Eclipse + JDK + SDK + ADT)都已经OK了。如果您还没有弄好,麻烦移步其他博客(比如, http://jingyan.baidu.com/article/f0062228f0b18afbd2f0c871.html ),搭建完了之后再过来看。 NDK开发所需要的基本软件,除了Eclipse + JDK + SDK + ADT 之外,还 需要如下软件 : ·NDK 开发包。 这是谷歌用于开发NDK程序发布的官方包。 · Cygwin (也许有其他的软件,比如GNUStep ),用于在window上模拟linux开发环境的软件。我们主要用来make和编译C/C++文件。 ·CDT (C/C++ Development

Android上传文件到PC的简单实例

别等时光非礼了梦想. 提交于 2019-11-30 03:15:12
最近一直在完成个任务,有关Android手机文件传输的,现在先做了一步,实现了手机可以上传文件到pc端。 先简单介绍一下吧,架设在电脑上的pc端,运行在Android手机上的客户端,pc端用java语言编写,客户端这边是结合c和 java的JNI来编写的。为什么这么特殊呢~呵呵 ,完全是出于任务要求的需要啦! 先上代码吧! 这边为了思路清晰点先上客户端的代码~顺序由上至下~ package zeng.Glogo.learn; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget

Android 开发之JNI学习笔记

混江龙づ霸主 提交于 2019-11-29 23:11:54
JNI—java native interface 官方文档 JNI is the Java Native Interface. It defines a way for managed code (written in the Java programming language) to interact with native code (written in C/C++). It's vendor-neutral, has support for loading code from dynamic shared libraries, and while cumbersome at times is reasonably efficient. JNI 即java 本地接口,它定义了一种方法(用java语言写)管理代码和本地代码(用C语言或者C++语言)交互。它是中立,它支持动态地从分享库中加载代码,虽然操作会麻烦些,但有时候它是必须的,有效的。 If you're not already familiar with it, read through the Java Native Interface Specification to get a sense for how JNI works and what features are available. Some

Java JNI学习笔记

你离开我真会死。 提交于 2019-11-29 23:11:43
一 创建一个Java项目,名称JNIDemo 二 新建HelloWorld.java 三 在dos下进入项目的bin文件夹下,使用 javah 命令编译HelloWorld.class文件 javah com.demo.jnidemo.HelloWorld 编译后会生成一个头文件 com_demo_jnidemo_HelloWorld.h 四 用VisualStudio创建一个win32控制台应用项目,应用程序类型选择 DLL ,附加选项选择 空项目 ,名称为NativeCode 五 将生成的头文件添加到项目,并导入jni.h和jni_md.h头文件,这两个文件在Java安装路径下 C:\Program Files\Java\jdk1.8.0_60\include C:\Program Files\Java\jdk1.8.0_60\include\win32 在com_demo_jnidemo_HelloWorld.h引用,本地头文件要用双引号 #include "jni.h" #include "jni_md.h" 六 新建cpp文件,添加如下内容 #include <iostream> #include "com_demo_jnidemo_HelloWorld.h" using namespace std; JNIEXPORT void JNICALL Java_com

Android ndk下用AssetManager读取assets的资源

故事扮演 提交于 2019-11-29 21:51:50
在使用 cocos2dx 在 Android 上进行游戏开发时,遇到了奇怪的事情,无论什么代码,都无法读资源文件。不得以只好寻求更高版本的Api。 在Android ndk api level 9 之后,提供了一套称为 AssetManager 的api。 这个api 的工作原理是 - Java通过JNI把getAssets得到的AssetManager传递给一个JNI的c函数。 - JNI的c函数通过 AAssetManager_fromJava 来取到这个AssetManager对象。 - 通过一系列的 AssetManager 的api来操作Assets。 C的jni函数如下 static AAssetManager * gAssetMgr = NULL; extern "C" { void Java_org_cocos2dx_lib_Cocos2dxActivity_nativeSetAssetManager(JNIEnv* env, jclass cls, jobject assetManager) { gAssetMgr = AAssetManager_fromJava( env, assetManager ); } }; 读取资源的方法如下 do{ AAsset * pAsset = AAssetManager_open(gAssetMgr, pszFileName,

用 JNI 进行 Java 编程(1)

我的梦境 提交于 2019-11-29 20:39:01
本教程是关于什么的? Java 本机接口(Java Native Interface (JNI))是一个本机编程接口,它是 Java 软件开发工具箱(Java Software Development Kit (SDK))的一部分。JNI 允许 Java 代码使用以其它语言(譬如 C 和 C++)编写的代码和代码库。Invocation API(JNI 的一部分)可以用来将 Java 虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用 Java 代码。 本教程涉及 JNI 最常见的两个应用:从 Java 程序调用 C/C++,以及从 C/C++ 程序调用 Java 代码。我们将讨论 Java 本机接口的这两个基本部分以及可能出现的一些更高级的编程难题。 我应该学习本教程吗? 本教程将带您去了解使用 Java 本机接口的所有步骤。您将学习如何从 Java 应用程序内部调用本机 C/C++ 代码以及如何从本机 C/C++ 应用程序内部调用 Java 代码。 所有示例都是使用 Java、C 和 C++ 代码编写的,并可以移植到 Windows 和基于 UNIX 的平台上。要完全理解这些示例,您必须有一些 Java 语言编程经验。此外,您还需要一些 C 或 C++ 编程经验。严格来说,JNI 解决方案可以分成 Java 编程任务和 C/C++ 编程任务