作为一个Andoird的Java程序猿,会受到Java语言的局限。由于作为一面门向对象的语言不能像C/C++那样轻易调用与硬件有关的操作。因此JNI就搭建了这样一个桥梁,使Java和C/C++语言之间能够互相调用。

作为一个Javaproject师对C/C++的语言不是非常熟悉,但仅仅需熟悉他们之间调用的原理和方法,关于C/C++的编程就交给C语言project师去吧。

在这篇文章中主要介绍NDK/JIN搭建和基本用法。

一、 环境的搭建

二、 主要的使用

步骤:

(1)新建Androidproject

(2)在java中声明native方法

(3)在project中新建jni目录(使用javah  test 生成头文件,编写C代码)

(4)编写Android.mk文件(是一个配置文件告诉NDK怎样编译C代码)

   LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := test-jni
LOCAL_SRC_FILES := test-jni.c
LOCAL_LDLIBS+=-llog
include $(BUILD_SHARED_LIBRARY)

(5)运行"ndk-build"生成动态库(在eclipse使用run也能够生成动态库)

(6)java代码"load"动态库,调用动态库

1、java调用C

java 调用native method(Class param)

在c中会调用的方法中參数(JNIEnv*,Jobject,Jint...)

2、c调用java

先用java调用c。c然后回调

JNIEXPORT void JNICALL Java_com_ndk2_test_ProvideBean_callHi(JNIEnv *env,
jobject obj) {
char*classname = "com/ndk2/test/ProvideBean";
jclass clazz;
clazz = (*env)->FindClass(env, classname);
if (clazz == 0) {
LOGI("can not find class");
} else {
LOGI("find the class");
} jmethodID mid = (*env)->GetMethodID(env, clazz, "showHi", "()V");
if (mid == 0) {
LOGI("can not find method");
} else {
LOGI("find method");
}
(*env)->CallVoidMethod(env, obj, mid); }
JNIEXPORT void JNICALL Java_com_ndk2_test_ProvideBean_calladd(JNIEnv *env,
jobject obj) {
char*classname = "com/ndk2/test/ProvideBean";
jclass clazz;
clazz = (*env)->FindClass(env, classname);
if (clazz == 0) {
LOGI("can not find class");
} else {
LOGI("find the class");
}
jmethodID mid = (*env)->GetMethodID(env, clazz, "showAdd", "(II)V");
if (mid == 0) {
LOGI("can not find method");
} else {
LOGI("find method");
}
(*env)->CallVoidMethod(env, obj, mid, 6, 7); }

运行项目之前还要配置环境:

c/c++ Bulid Build command:  bash D:\cygwin64\android-ndk-r8c\ndk-build

c/c++ General/Paths and Symbols/GNU C add D:\cygwin64\android-ndk-r8c\platforms\android-14\arch-arm\usr\include

假设还在报一些编译环境的错误。把project转移到D:\cygwin64\android-ndk-r8c\samples基本就能够通过,这里我也不是非常清楚是为什么,预计是路径映射的问题,哪位大神知道,能够分享下。

【Android高级】NDK/JNI编程技术基础介绍的更多相关文章

  1. Android studio 下JNI编程实例并生成so库

    Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...

  2. android windows 上JNI编程

    昨天学习windows上的JNI编程,JNI说白了就是java和c语言的一个互相沟通的桥梁.java能够调用JNI来完毕调用C语言实现的方法. JNI的全称是(Java native interfac ...

  3. C# 高级编程01----.Net基础介绍

    一.C#与.Net 的关系 1)C#语言 1. C#是一种简洁.类型安全的面向对象语言,可以使用C#语言创建可以在.Net Framework上运行的应用程序 2. C# 语言功能取决于.Net 的功 ...

  4. Android Studio NDK JNI动态注册本地方法

    概述 可能大家觉得javah生成的函数名又臭又长,不太好看.这里可以提供另外一种方法来动态注册c++函数,让其根Java中的native方法关联起来. 实现 这里通过JNIEnv的Resisterna ...

  5. shell编程awk基础介绍

    awk介绍 报告生成器,格式化文本输出 处理机制类似sed命令,自带循环处理    读入一行处理一行然后自动读取下一行再进行处理 sed命令换行的标识是固定的,只能是回车换行.    awk里面的换行 ...

  6. TCP/IP网络编程技术基础

    零零碎碎记下点→ 不对的欢迎大家批评纠正→ 以免本人及偶尔看到此博客的人继续迷途未返→ >>>>>基础知识→ 1→TCP/IP英文名:Tranmission Contro ...

  7. 【转】Android JNI编程—JNI基础

    原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...

  8. 【android 开 发 】 - Android studio 下 NDK Jni 开发 简单例子

    Android 开发了一段时间,一方面 ,感觉不留下点什么.有点对不起自己, 另一方面,好记性不如烂笔头,为了往后可以回头来看看,就当做是笔记,便决定开始写博客.废话不多说 ! 今天想搞一搞 ndk ...

  9. Android studio 下 NDK Jni 开发 简单例子

    1. 创建一个新的工程 2. 创建一个新的类 JniText.java  点击Build--Make Project  后     选中工程 点击F4键 sdk location 中 Android ...

随机推荐

  1. 用CSS模拟魔兽世界技能冷却的效果

    效果演示   上面的效果看起来还不错吧.在网页里,除了用Flash,我们还是有不少方法可以实现它. 显然这种效果不复杂,一张背景图片,加上前面带有透明度的多边形图层,在脚本控制下就可以转起来了.但问题 ...

  2. HCNA--tcp/ip基础

    1.OSI七层参考模型 应用层 7 表示层 6  高层:负责主机之间的的数据传输 会话层 5 传输层 4 主机之间端到端的连接 tcp /udp segment 网络层 3 路由 寻址  packet ...

  3. HDU1285 裸的拓扑排序

    拓扑排序: 拓扑排序是应用于有向无回路图(DAG)上的一种排序方式,对一个有向无回路进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u在v的前面.该序列说明了顶点表示的事件或 状态发生 ...

  4. Unicode字符集和多字节字符集关系

      在计算机中字符通常并不是保存为图像,每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset). 在最初的时候,Internet上只有一种字符集—— ...

  5. bootstrap3基本了解

    使用 BootCDN 提供的免费 CDN 加速服务(同时支持 http 和 https 协议) Bootstrap 中文网 为 Bootstrap 专门构建了免费的 CDN 加速服务,访问速度更快.加 ...

  6. Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射

                                                        Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...

  7. UVALIVE 2927 "Shortest" pair of paths

    裸的费用流.一开始因为这句话还觉得要拆点 样例行不通不知道这句话干啥用的.Further, the company cannot place the two chemicals in same dep ...

  8. C++ 采集音频流(PCM裸流)实现录音功能

    与上一篇的“C++ 播放音频流(PCM裸流)” 点击打开链接 相对应,本篇是关于用C++实现录音功能的.同样是直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用,也可以下载本人上传的相关 ...

  9. logrotate 学习使用

    logrotate Summary : Rotates, compresses, removes and mails system log files Description : The logrot ...

  10. AC日记——Roma and Poker codeforces 803e

    803E - Roma and Poker 思路: 赢或输或者平的序列: 赢和平的差的绝对值不得超过k: 结束时差的绝对值必须为k: 当“?”时可以自己决定为什么状态: 输出最终序列或者NO: dp( ...