Android JNI配置及入门

JNI是一种可以在Java中调用C/C++代码的技术,也就是说可以在Android上使用C/C++来开发。但是并不能用纯C/C++来开发Android应用,因为这些C/C++代码要通过Java定义的接口来调用。

我试验Android上的JNI时使用的是NDK-R10,不需要Cygin,使用版本较低的NDK时请另寻教程。

NDK的安装与ADT中如何配置NDK

可以到Android Developer官网上去下载最新的NDK工具包,下载下来之后解压到随便一个好找的目录,比如我们解压到了C:\,这样NDK就被安装在了C:\android-ndk-r10目录中。

要在你的Android工程使用NDK还需要进行配置,配置的方法非常简单:

在eclipse ADT中,点开Window->Preference->Andorid->NDK,然后在NDK Location中填入你安装NDK的目录,也就是上面的C:\android-ndk-r10。现在ADT就可以根据你提供的NDK路径自动调用跟构建NDK项目相关的工具了。

试试第一个NDK程序

1. 首先在eclipse ADT中创建一个名为NDKTest的Android项目。

2. 在ADT中你要使用NDK的工程目录上(这里也就是NDKtest目录),鼠标右键后选择Android Tools->Add Native Support...

在弹出的对话框中填入你将要生成的二进制链接库的文件名,这里我们以hello.so为例

然后单击finish,稍等一会儿,就会发现在你的工程目录里多了一叫jni的文件夹。

3. 现在就可以开始写最终起作用那部分的C/C++代码了,这些代码都要写在hello.cpp里面(这个cpp文件的文件名和你刚才要创建的.so的链接库的文件名一样),我们在cpp中写入如下代码:

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

// C/C++定义的方法必须为Java+包名+activity名+你的函数名,每个部分之间要用下划线_来连接,
// 而且参数也是固定的。所以定义C/C++函数的固定格式为:
// Java_PackageName_ActivityName_function(JNIEnv* env, jobject obj) {...}
//
// 这里extern "C"是为了防止C++编译二进制链接库时对函数进行改名,其实加不加都不影响这段实现代码的运行效果,
// 但是如果你的程序因为java.lang.UnsatisfiedLinkError: Native method not found这
// 错误而崩溃的话你还是加上吧。
extern "C" jstring Java_com_example_ndktest_MainActivity_hello(JNIEnv* env, jobject obj) {
	return env->NewStringUTF("hello JNI.");
}

代码中的注释已经说明的非常明白了,你定义的C/ C++函数都要按照固定的格式来命名。

在你点击run按钮来运行你的app时ADT会自动调用ndk-build来编译我们的C/C++代码。

4. 要调用我们写好的C/C++代码,需要我们在Java源码中加入如下代码片:

public class MainActivity extends Activity {
	// 因为static块比其他代码都更优先加载,所以在这里我们导入我们的动态链接库
	// 记得之前让你自己填写的.so文件名吧,这里你把文件名写上就可以导入了
	static {
		System.loadLibrary("hello");
	}

	// 要使用自己定义的C/C++函数要像这样在Java代码中定义一个空方法
	// 返回值和你之前定义的C/C++函数返回的类型一样,函数名和C/C++函数名
	// 最后那一部分就可以了,因为最后一部分才是函数名
	public native String hello();

	...
}

5. 这样一来我们的C/C++代码和Java调用接口都准备好了, 我们可以测试一下。

在MainActivity的xml布局代码中加入如下代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
    <!-- 用这个TextView来显示咱们的结果 -->
    <TextView
        android:id="@+id/display"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

然后在Java代码中加入如下部分:

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	((TextView) findViewById(R.id.display)).setText(hello());
}

运行后的效果:

如果转载请注明出处:http://blog.csdn.net/gophers

Android JNI配置及入门

时间: 2024-10-03 06:36:52

Android JNI配置及入门的相关文章

Android jni本地编程入门

在某些情况下,java编程已经不能满足我们的需要,比如一个复杂的算法处理,这时候就需要用到jni技术: jni : java native interface jni 其实就是java和c/cpp之间进行通信的一个接口规范,java可以调用c/cpp里面的函数,同样,c/cpp也可以调用java类的方法: jni开发工具ndk的安装:在最新的ndk版本中,安装ndk很简单,只需要装ndk的路径配置到系统环境变量中即可:在编译的时候,进入工程根目录:执行命令  ndk-build  即可完成编译:

Android jni 编程入门

本文将介绍如何使用eclipse和ndk-build来编写一个基于Android4.4版本的包含有.so动态库的安卓程序. 前提是已经安装和配置好了诸如SDK,NDK等编译环境.下面开始编程! 1 程序逻辑 我们要编写的程序包含两部分:java部分--负责界面和调用JNI native函数:JNI native 部分--负责native函数的具体实现(本文使用C语言). native 函数伪代码如下: ? 1 2 3 4 5 6 7 8 /* funtion: 传入两个整形变量,计算他们之和 r

as使用jni入门 : 配置ndk开发环境,配置as相关jni配置

1.通过as内置的Android SDK下载需要使用的ndk,在系统环境变量设置相关参数 2.新建一个普通as项目,新建一个类,用来静态加载so库和书写本地native方法 3.目录,在as的terminal控制台输入命令 cd app\build\intermediates\classes\debug 进入编译好的class文件根目录,再次输入命令 javah -jni /*class文件的全路径*/,会生成对应的.h文件 4.将生成的.h文件复制到as目录的jni目录下(可以改名,我这里改名

Android JNI 入门

Android JNI (Java Native Interface)就是为了实现java 与其他语言相互调用的语言.当然在Android就是为了跟C,C++的调用.在Linux ,Mac中Java最后调用的就是.so的文件,在Window中就是.dll文件. 那么Java到C怎么对应起来?调用Java的哪个方法就是C中的哪个方法呢?通过在Java类中声明native的方法就开始了. 新建一个Android工程HelloNDK.新建一个类GetString public class GetStr

Android JNI入门教程

Android JNI入门教程 最近公司里有项目要用到jni,就研究并整理了下,现在分享给大家. 下载最新的ndk,新建环境变量NDK_ROOT,值是ndk的根目录,并把它加到PATH.这样做是因为我们要用到ndk的ndk-build.cmd,而且像eclipse要根据NDK_ROOT识别ndk. 现在新建一个最简单的安卓工程NewJNI,修改类MainActivity: public class MainActivity extends Activity { public native voi

OpenCV On Android环境配置最新&amp;最全指南(Android Studio篇)

本文是从本人简书上搬运而来,属本人原创,如有转载,请注明出处:http://www.jianshu.com/p/6e16c0429044 简介 本文是<OpenCV On Android环境配置最新&最全指南>系列教程第二篇,也是配置教程的最后一篇.通过对android Studio里opencv环境配置讲解,快速帮新人解决入门配置问题. 本文内容是本人经过多次踩坑,并参考网上众多OpenCV On Android的配置教程总结而来,尽希望能帮助学习移动图像处理的朋友们少走弯路,如有转

Android JNI programming demo with Eclipse

用Eclipse 建立 JNI 的專案, 示範如何在 JAVA 調用 cpp 的函數. 我們將建立一個名稱為 jnidemo的專案, 在主Activity 將調用一個名為libHello.so 的 cpp 函數庫的 getVersion() 的函數, 將其返回字串寫在主Activity 的TextView 上. 首先用Eclipse建立一個新的 Android Activity 專案.  其他選項都用預設值就可以. 1. 稍微修改主活動配置 layout/activity_main.xml, 

基于Eclipse的Android JNI层测试应用开发过程记录

前言 本文记录一个Java层与JNI层参数与数据交互的应用程序开发过程,为实现一个功能完整的带Java与JNI的应用程序打下基础.本文假设读者已搭建好Android的Eclipse与NDK开发环境,包括通过ADB连接手机的配置. 1. 构建基本的Android应用程序 1.1 引导界面配置 打开Eclipse,"File"->"New"->"Android Application Project",在弹出界面,配置如下(红色框表示不是

Android JNI初体验

开始接触Android JNI层面的内容,推荐一本不错的入门级的书<Android的设计与实现:卷一>,这两天看了一下关于Java层和Native层函数映射的章节,加深对JNI的理解. 先是写了一个非常简单的计算器,关键的运算放在Native层实现,然后把运算的结果返回到Java层,写这个的时候还是自己手动建jni文件夹,javah的命令行,写makefile文件,用ndk-build命令行来编译,后来发现要调试C代码了,才发现高版本的ndk环境已经全都集成好了,编译,运行,调试甚至和VS差不