【Android高级】NDK/JNI编程技术基础介绍
作为一个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编程技术基础介绍的更多相关文章
- Android studio 下JNI编程实例并生成so库
Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...
- android windows 上JNI编程
昨天学习windows上的JNI编程,JNI说白了就是java和c语言的一个互相沟通的桥梁.java能够调用JNI来完毕调用C语言实现的方法. JNI的全称是(Java native interfac ...
- C# 高级编程01----.Net基础介绍
一.C#与.Net 的关系 1)C#语言 1. C#是一种简洁.类型安全的面向对象语言,可以使用C#语言创建可以在.Net Framework上运行的应用程序 2. C# 语言功能取决于.Net 的功 ...
- Android Studio NDK JNI动态注册本地方法
概述 可能大家觉得javah生成的函数名又臭又长,不太好看.这里可以提供另外一种方法来动态注册c++函数,让其根Java中的native方法关联起来. 实现 这里通过JNIEnv的Resisterna ...
- shell编程awk基础介绍
awk介绍 报告生成器,格式化文本输出 处理机制类似sed命令,自带循环处理 读入一行处理一行然后自动读取下一行再进行处理 sed命令换行的标识是固定的,只能是回车换行. awk里面的换行 ...
- TCP/IP网络编程技术基础
零零碎碎记下点→ 不对的欢迎大家批评纠正→ 以免本人及偶尔看到此博客的人继续迷途未返→ >>>>>基础知识→ 1→TCP/IP英文名:Tranmission Contro ...
- 【转】Android JNI编程—JNI基础
原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...
- 【android 开 发 】 - Android studio 下 NDK Jni 开发 简单例子
Android 开发了一段时间,一方面 ,感觉不留下点什么.有点对不起自己, 另一方面,好记性不如烂笔头,为了往后可以回头来看看,就当做是笔记,便决定开始写博客.废话不多说 ! 今天想搞一搞 ndk ...
- Android studio 下 NDK Jni 开发 简单例子
1. 创建一个新的工程 2. 创建一个新的类 JniText.java 点击Build--Make Project 后 选中工程 点击F4键 sdk location 中 Android ...
随机推荐
- HDU 5752
Sqrt Bo Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- Codeforces 922.F Divisibility
F. Divisibility time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 微信2种access_token对比
1.需求 了解网页accesstoken和基础accesstoken的不同 参考资料:http://www.cnblogs.com/wellsoho/p/5089409.html
- 平面ray trace的数据结构加速
yy了一个数据结构.. 首先考虑到,平面ray trace对应的scene是planar graph with coordinates,特点是除端点外无相交. 我们考虑对所有端点建立kd-tree,注 ...
- 关于SelectedValue的众多解决方案
Combox联动效果
- 再议gluPerspective和gluLookAt的关系
http://www.cnblogs.com/chengmin/archive/2011/09/12/2174004.html 看了Opengl的相关程序,发现有些东西还是特别迷茫,尤其是gluLoo ...
- UVALIVE 3645 Objective: Berlin
最大流 .以航班为节点进行最大流. 容量限制进行拆点. 如果时间地点满足可以建一条边. 具体看代码.变量名被修改过了.一开始的变量名可能比较容易看懂 但CE了.可能与库里的变量重复了. AC代码 #i ...
- Unicode 和 ANSI
Project Properties -> General-> Character set,里面显示了是不是unicode. Unicode处理String的方式不一样,一定要注意!! ...
- django视图重定向
# 原创,转载请留言联系 当请求访问到某个视图时,我们想让它重定向到其他页面,应该怎么做呢? 1.HttpResponseRedirect 需求:当我们访问127.0.0.1/my_redirect时 ...
- UVA 11324 The Largest Clique(缩点+DAG上的dp)
求最大团.和等价性证明有类似之处,只不过这个不是求互推,而是只要a->b,或b->a即可. 同样的,容易想到先缩点,得到DAG,每个节点上保存SCC的点数,相信任意一条由根节点(入度为零) ...