Android Jni使用案例
来源:互联网 发布:华为网络机顶盒密码 编辑:程序博客网 时间:2024/06/01 09:59
Android Jni使用案例
Android上层和C/C++层通信可以通过JNI实现,具体做法有两种:
1). 编写带有native方法的Java类;
Gpio.java 代码:
2). 使用javah命令生成.h头文件;
自动生成头文件com_prowave_jnitest_Gpio.h(头文件的命名格式是javah根据java类的包名类名自动生成):
方法名称Java_com_prowave_jnitest_Gpio_nativePrintJNI解释:Java_包名(层级关系用_分隔)_类名_方法名
3). 编写Gpio.c代码实现头文件中的方法
4). 编写Android.mk文件,通过NDK编译生成so文件(NDK集成开发环境需要自行安装)
通过ndk-build编译最终生成libGpio.so文件,可供上层应用使用,比如调用Gpio.java的printJNI方法,最终获得C代码中Java_com_prowave_jnitest_Gpio_nativePrintJNI方法中返回的字符串。
注意事项:通过这种方式去实现JNI,Java代码中声明native方法时不能带下划线,比如nativePrintJNI方法不能写成native_printJNI,因为C/C++中的方法命名规则是“Java_包名(层级关系用_分隔)_类名_方法名”这种形式,以此来匹配Java类中的方法,下划线导致生成的头文件中方法名多出一个下划线,这样就匹配不上Java中定义的本地方法了。
生成头文件的方法有两个:
1). 用eclipse新建一个java项目或者android项目,在com/prowave/jnitest包下新建Gpio.java文件,添加上native方法,eclipse会自动编译java文件,生成Gpio.class文件在bin/class/com/prowave/jnitest/目录下。终端(window环境下可使用cygwin)进入bin同级目录,执行命令:javah -classpath bin/classes/ -d jni com.prowave.jnitest.Gpio,生成com_prowave_jnitest_Gpio.h头文件在jni目录。
-classpath:指定路径,这里只要指定com/prowave/jnitest这个包所在的路径就可以了,并不是指Gpio.class的路径,所以classpath的参数为bin/classes/;
-d jni:在当前路径生成一个jni文件夹;
com.prowave.jnitest.Gpio:java文件的包名类名。
2). 直接写一个xxx.java文件,通过javac xxx.java编译,生成xxx.class文件;新建文件目录,比如xxx.java文件里的包名是这样定义的:package com.prowave.jnitest;建立com/prowave/jnitest(这几个文件夹是层级关系),将xxx.class拷贝到最里面的文件夹jnitest;在当前目录打开终端,执行命令:javah -classpath . -d jni com.prowave.jnitest.Gpio,生成com_prowave_jnitest_Gpio.h。
1). 编写带有native方法的Java类;
Gpio.java 代码:
2). 定义C/C++文件,重写JNI_OnLoad()函数 (Gpio.c文件)
3). 编写Android.mk文件,通过NDK编译生成so文件(NDK集成开发工具需要安装)。
通过这种方式注册的好处:
1>. 函数名称可以自定义,无须遵循特殊的命名格式
2>. 不需要通过javah生成头文件
3>. 将本地函数向VM进行登记,VM能更有效率的去找到registerNativeMethods。
4>. 可在执行期间进行抽换。由于gMethods[]是一个<名称,函数指针>对照表,在程序执行时,可多次呼叫registerNativeMethods()函数来更换本地函数之指针,而达到弹性抽换本地函数之目的。
附上案例源代码,下载地址:http://download.csdn.net/detail/visionliao/9532013
- Android Jni使用案例
- Android Jni使用案例
- Android Studio下JNI的使用案例
- Android NDK JNI实现案例
- Android Studio JNI 开发简单案例
- jni的使用案例,验证jni中线程是否停止
- JNI案例
- android中使用JNI
- Android JNI 使用
- android 如何使用jni
- android 使用jni
- Android Jni 使用篇
- linux android 使用JNI
- Android JNI的使用
- android jni 使用过程
- Android之JNI使用
- Android使用JNI
- Android JNI使用例子
- C++Primer第五版 第十一章习题答案(1~10)
- Java Web项目中解决中文乱码方法总结
- 蓝桥杯——指针部分基础内容回顾二(2017.2.27)
- poj2398 Toy Storage【叉乘】
- PAT 1028
- Android Jni使用案例
- HDU 2859 Phalanx
- leecode 解题总结:309. Best Time to Buy and Sell Stock with Cooldown
- 字符串
- 【CodeForces】779D
- [Spring实战系列]
- 【机器学习】文本数据简单向量化
- 如何开发编译部署调用智能合约
- vue单页面开发心得