Android 学习JNI,用JAVA调用C

首先必须知道JNI是什么东东?

JNI(Java Native Interface)是java本地语言接口,也就是提供一种方法可以用JAVA调用底层语言(C/C++)。一般如果项目必须使用C语言操作底层的硬件,那就必须用到JNI技术。

那既然要使用JAVA调用C语言,那必须要解决几个问题?

1:JAVA是面向对象的语言,而C是面向过程的语言

2:JAVA中的Object,String类型,Boolean类型,在C中都是没有的,那C语言是如何识别的?

其实这些JNI都给我们做好了,在JNI的头文件#include <jni.h>中就有

typedef unsigned char   jboolean;       /* unsigned 8 bits */
typedef signed char     jbyte;          /* signed 8 bits */
typedef unsigned short  jchar;          /* unsigned 16 bits */
typedef short           jshort;         /* signed 16 bits */
typedef int             jint;           /* signed 32 bits */
typedef long long       jlong;          /* signed 64 bits */
typedef float           jfloat;         /* 32-bit IEEE 754 */
typedef double          jdouble;        /* 64-bit IEEE 754 */
/*
 * Reference types, in C.
 */
typedef void*           jobject;
typedef jobject         jclass;
typedef jobject         jstring;
typedef jobject         jarray;
typedef jarray          jobjectArray;
typedef jarray          jbooleanArray;
typedef jarray          jbyteArray;
typedef jarray          jcharArray;
typedef jarray          jshortArray;
typedef jarray          jintArray;
typedef jarray          jlongArray;
typedef jarray          jfloatArray;
typedef jarray          jdoubleArray;
typedef jobject         jthrowable;
typedef jobject         jweak;

可以看到JAVA中的object对象在void* ,这个学过C语言的大家都知道。

注意:在学习JNI之前,需要在Google官网下载NDK安装,并且配置环境变量。

本次我们学习如何使用JAVA语言调用C语言,然后打印Hello World!

第一步: 建立一个Android Application工程

第二步:在项目根目录下建议一个文件夹,命名为jni

第三步:在jni文件夹中,创建一个C文件

第四步:在Java代码,创建一个本地方法: helloFromC

第五步:在hello.c中实现第四步定义的本地函数,但是函数名必须为:Java+包名+Java文件+本地方法名

如: Java_com_demo_helloworld_MainActivity_helloFromC(JNIEnv* env, jobject obj)

第六步:把c的字符串转化为Java的字符串返回

第七步:在jni文件夹中创建Android.mk文件,这个类似与MakeFile文件

第八步:在jni文件夹下执行ndk-build.cmd指令

第九步:在Java中加载动态库,调用本地方法

第十步:部署,如果出现以下错误

说明CPU平台是补对的,默认是ARM的架构CPU,而我模拟器用的X86的,难道我要新建一个ARM的模拟器,不用那么麻烦

第十一步:编译支持X86的平台,在jni文件夹下新建Application.mk文件

可以发现再次编译,出现了x86的库

再次部署运行:

可以看到C语言返回的Hello_World可以正常打印出来了。说明JAVA调用C语言成功。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-01 14:55:24

Android 学习JNI,用JAVA调用C的相关文章

Android与JNI(二) ---- Java调用C 动态调用(转载)

目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 Android与JNI(一)已经简单介绍了如何在 android  环境下使用 JNI 了.但是遵循 JNI 开发的基本步骤似乎有点死板,而且得到的

ndk学习17: jni之Java调用C&C++

一.Hello World 1. 定义函数原型 native关键字定义的函数即为jni函数 2.生成头文件 切换到src目录执行: (这个过程可以写脚本自动完成,比如自动拷贝到jni目录) javah -jni 包名.类名 在根目录下生成: org_bing_testjni_MainActivity.h 3. 工程中添加jni代码 工程右键->添加native code->输入名字->finish 多了如下文 新建一个Application.mk,配置相关选项(详细查看ndk有关Appl

Android学习Scroller(二)——ViewGroup调用scrollTo()

MainActivity如下: package cc.ac; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.app.Activity; /** * Demo描述: * 对ViewGroup调用sc

Android学习Scroller(一)——View调用scrollTo()的理解及使用

MainActivity如下: package cc.uu; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.app.Activity; /** * Demo描述: * scrollTo()和scrollB

[转] Android自动化测试之使用java调用monkeyrunner(五)

Android自动化测试之使用java调用monkeyrunner 众所周知,一般情况下我们使用android中的monkeyrunner进行自动化测试时,使用的是python语言来写测试脚本.不过,最近发现可以用java调用monkeyrunner Api,用java语言写测试脚本. 于是,就简单研究了一下.这里做一些总结.希望有对在研究的午饭可以有所用处. 开始时,搜素到一些零碎的教程,说使用java调用monkeyrunner时,需要导入android sdk  tools路径下的lib里

Android学习JNI,使用C调用JAVA语言

本节学习使用C语言调用JAVA语言.在生活中比如我们某些底层的硬件必须使用C语言去编写,当C语言返回的某些数值显示在界面上时,就比如使用JNI.这样可以将C返回的值显示在界面上. 本节模拟传感器返回的值,通过进度条显示灵敏度,然后显示到界面上. 1:界面布局就补多说了.里面就2个Button,一个用于开启监控,一个用于关闭监控,一个进度条 2:Activity代码如下: //开始监控button public void start(View v) { startMonitor(); } //停止

Android JNI之JAVA调用C/C++层

摘要: 转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5929996.html 一.java调用本地函数的开发步骤: 1.编写本地方法的类(可以说是用来叙述本地方法的类): 2.编译这个类,生成该类的.class文件 在Android Studio下有很多方法: 点击Make Project Clean Project + Rebuild Project 运行或Debug  APP 3.用javah命令生成该.class文件的.h头文件 在Android

JNI之Java调用so文件

一.背景:web项目中需要调用第三的一个so库文件,只能略微学习下了,对android NDK开发方面应该也有所帮助,学习下 二.调用方式 第一种方式:Java直接调用so文件 第二种方式:Java通过自己的so文件,调用第三方的so文件 三.参考示例(就不拷贝来拷贝去了,直接贴上我参考的网址吧) 参考网址: Java调用so,c编译成so    http://blog.chinaunix.net/uid-20180960-id-1972669.html Java文件 -> *.class ->

Android学习探索之Java 8 在Android 开发中的应用

前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上,一直没有看到支持Java8的消息.Android到底会不会支持Java8呢?答案是肯定的,Android N已经开始支持Java 8 了. 关于Java 8 (1.)使用Lambda表达式 Java 8的一大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.当开发者在编写Lambda表达式时