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 GetString {
	public static native String GetString();
	public static native String GetString(int a,int b);
	public static native String getWord();
}

具体的步骤如下:

1、在Java中声明native()方法,然后编译(javac);

2、用javah产生一个.h文件;

3、编写包含.h文件的c文件

4、编译c文件

5、使用编译成功的so文件。

在我建立Android Project中是怎么实现的?其实在工程的bin/classes/目录下(classes是隐藏的)就第一步就编译好了,所以我们在这目录下进行第二步,命令为:

javah -jni com.example.hellondk.GetString(包+类)

就会生成com.example.hellondk.GetString.h 头文件,只要你NDK目录配置好了,接下来就是右键工程在Android Tool中选Add Native Support 看到工程名点finish。

接下来就在工程下看到多了jni这个文件夹。里面有Android.mk,还有同工程名的.cpp文件。

把刚才生成的.h文件拷贝到jni文件夹下。

编写c文件呢先要看下.h头文件里面写的是什么

* Class:     com_example_hellondk_GetString
 * Method:    GetString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__
  (JNIEnv *, jclass);

/*
 * Class:     com_example_hellondk_GetString
 * Method:    GetString
 * Signature: (II)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__II
  (JNIEnv *, jclass, jint, jint);

/*
 * Class:     com_example_hellondk_GetString
 * Method:    getWord
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_getWord
  (JNIEnv *, jclass);

方法名称很吓人,不过看下就知道Java跟C的方法就这样对应起来了。JNIEnv等其他参数以后再讲

接下来是实现在.cpp文件中实现这些方法。复制过去

#include "com_example_hellondk_GetString.h"
/*
 * Class:     com_example_hellondk_GetString
 * Method:    GetString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__
  (JNIEnv * env, jclass){
	return env->NewStringUTF("hello ndk");
};

/*
 * Class:     com_example_hellondk_GetString
 * Method:    GetString
 * Signature: (II)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__II
  (JNIEnv * env, jclass, jint a, jint b){
	return env->NewStringUTF("result a+b="+(a+b));
};

JNIEXPORT jint JNICALL Java_com_example_hellondk_GetInt_getInt
  (JNIEnv * env, jclass, jint a){
	return a;
};

简单的返回输出。

那现在怎么使用呢?其实我们还可以看到在工程的libs目录下生成了armeabi文件夹下生成了libHelloNDK.so库文件。这个就是我们要使用的.so库文件啦

在MainActivity中

static {
		System.loadLibrary("HelloNDK");
	}

就可以了。接下就可以直接用GetString的方法,这样就实现了Java-->C了。

时间: 2024-07-30 18:42:47

Android JNI 入门的相关文章

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

android JNI入门-学习笔记

JNI入门-学习笔记 可执行文件 Windows - *.exe | linux - *.elf c函数库文件 Windows - *.dll | linux - *.so 批处理文件 Windows - *.bat | linux - *.sh 工具 NDK -- native developer kits Cygwin -- Linux系统模拟器 安装过程要点: --安装时可以联网安装也可以通过本地文件安装(如果有本地文件) --Select Packages:没必要全部安装,安装Devel

Android JNI入门

先啰嗦一段,从学习Android以来一直会看到这个JNI,偶尔也看到要写c/c++的代码,其实从心里就是有些排斥的,毕竟我学的是Java,我学习一个JNI我还得学会c++,c其实是学了一遍了,但是长期不用基本也就忘了,虽然基本的都是看得懂的,但是编码并不是看得懂就行的,要自己能写,所以其实打心底是排斥JNI的.但是学习Android的时间越长,我发现JNI是支撑Android运行的一大模块,比如我们常见的那些播放音频的功能其实底层就是使用了JNI,这样子就让Java代码可以调用底层的c代码,从而

Android JNI入门第二篇——Java参数类型与本地参数类型对照

前面一篇通过简单的例子介绍了android中JNI的使用.这一篇从基础上了解一些Java参数类型与本地参数类型区别. 1)        java中的返回值void和JNI中的void是完全对应的哦!(仅仅一个而已). 2)        java中的基本数据类型(byte ,short ,int,long,float,double ,boolean,char-8种)在JNI中对应的数据类型只要在前面加上j就对应了(jbyte ,jshort ,jint,jlong,jfloat,jdouble

Android JNI入门第一篇——HelloJni

android支持使用NDK开发C程序,关于配置NDK环境问题应该不用再赘述了,这个网上有很多,这里通过一篇实例来讲述简单的JNI开发,大家可以参考这篇文章(Get Your Eclipse-Integrated NDK On!)搭建Eclipse编译C语言为so文件的开发环境. native方法实现步骤如下: 1.在Java中声明native()方法,然后编译(javac): 2.用javah产生一个.h文件: 3.编写包含.h文件的c文件 4.编译c文件 5.使用编译成功的so文件. 第一步

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

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:\,这样N

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开发有哪些常见的错误

我们在Android jni开发中,特别是对于刚入门学习Android jni开发的同学来说,往往会遇到很多错误,这里总结了我们经常遇见的错误.这些错误,你是否经常遇到. 错误1:java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到 1.本地函数名写错 2.忘记加载.so文件 没有调用System.loadlibrary 错误2:findLibrary returned null 1.System.loadLibrar