作为一个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. Educational Codeforces Round 42 (Rated for Div. 2) A

    A. Equator time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...

  2. bzoj [Noi2008] 1061 志愿者招募 单纯形

    [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 5437  Solved: 3267[Submit][Status][Di ...

  3. 快速激活最新JetBrains公司系列产品包括最新的phpstorm10

    快速激活最新JetBrains公司系列产品包括最新的phpstorm10 IntelliJ IDEA开源社区 提供了如下通用激活方法: 注册时选择License server 然后输入框填写:http ...

  4. 洛谷P1522 牛的旅行

    题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...

  5. Hibernate中用注解配置一对多双向关联和多对一单向关联

    Hibernate中用注解配置一对多双向关联和多对一单向关联 Hibernate提供了Hibernate Annotations扩展包,使用注解完成映射.在Hibernate3.3之前,需单独下载注解 ...

  6. Codeforces Round #395 Div.2 题解

    感受 第一次参加CF的rating比赛,感觉还是非常exciting,前18分钟把AB切掉之后一直在考虑C题,结果最后还是没有想出来Orz 传送门 A 比较水的模拟,就是计算:\(\frac{z}{l ...

  7. Easy Install详细参数

    Easy Install Easy Install is a python module (easy_install) bundled with setuptools that lets you au ...

  8. OpenGL函数思考-glColor

    http://blog.csdn.net/shuaihj/article/details/7231980 OpenGL函数思考-glColor 函数原型:      glColor3b,glColor ...

  9. 将打开的网页以html格式下载到本地

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Appium+python自动化13-native和webview切换【转载】

    前言 现在大部分app都是混合式的native+webview,对应native上的元素通过uiautomatorviewer很容易定位到,webview上的元素就无法识别了. 一.识别webview ...