Android学习JNI,使用C调用JAVA语言
2015-08-20 16:12
555 查看
本节学习使用C语言调用JAVA语言。在生活中比如我们某些底层的硬件必须使用C语言去编写,当C语言返回的某些数值显示在界面上时,就比如使用JNI。这样可以将C返回的值显示在界面上。
本节模拟传感器返回的值,通过进度条显示灵敏度,然后显示到界面上。
1:界面布局就补多说了。里面就2个Button,一个用于开启监控,一个用于关闭监控,一个进度条
2:Activity代码如下:
//开始监控button
public void start(View v)
{
startMonitor();
}
//停止监控button
public void stop(View v)
{
stopMonitor();
}
//开始监控和停止监控的本地方法
public native void startMonitor();
public native void stopMonitor();
//c语言调用java的刷新进度条函数
public void showValue(int progress)
{
bar.setProgress(progress);
}3:本地JNI代码
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
int monitor = 1;
//随机产生的值
int getPressure()
{
return rand()%100;
}
/*
* Class: com_demo_ccalljava_MainActivity
* Method: startMonitor
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_demo_ccalljava_MainActivity_startMonitor
(JNIEnv *env, jobject obj)
{
while(monitor)
{
//获取当前的压力值
int value = getPressure();
//利用反射找打show方法
//1:找到字节码文件
jclass cClass = (*env)->FindClass(env, "com/demo/ccalljava/MainActivity");
//2:找到方法id
//show是调用java方法的名字, (I)V是该方法的签名
jmethodID methodID = (*env)->GetMethodID(env,cClass, "showValue", "(I)V");
//3:调用方法
(*env)->CallVoidMethod(env, obj, methodID, value);
sleep(1);
}
}
/*
* Class: com_demo_ccalljava_MainActivity
* Method: stopMonitor
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_demo_ccalljava_MainActivity_stopMonitor
(JNIEnv *env , jobject obj)
{
monitor = 0;
}
3:加载动态库
static
{
System.loadLibrary("CCallJava");
}4:开始监控显示:
当按下开始后,出现了卡死GUI,这是因为startMonitor是跑在主线程的,所以卡住GUI
5:修改,startMonitor运行在子线程
//开始监控button
public void start(View v)
{
Thread thread = new Thread()
{
@Override
public void run() {
startMonitor();
}
};
thread.start();
}
6:运行再次显示效果:
可以正常显示。
本节模拟传感器返回的值,通过进度条显示灵敏度,然后显示到界面上。
1:界面布局就补多说了。里面就2个Button,一个用于开启监控,一个用于关闭监控,一个进度条
2:Activity代码如下:
//开始监控button
public void start(View v)
{
startMonitor();
}
//停止监控button
public void stop(View v)
{
stopMonitor();
}
//开始监控和停止监控的本地方法
public native void startMonitor();
public native void stopMonitor();
//c语言调用java的刷新进度条函数
public void showValue(int progress)
{
bar.setProgress(progress);
}3:本地JNI代码
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
int monitor = 1;
//随机产生的值
int getPressure()
{
return rand()%100;
}
/*
* Class: com_demo_ccalljava_MainActivity
* Method: startMonitor
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_demo_ccalljava_MainActivity_startMonitor
(JNIEnv *env, jobject obj)
{
while(monitor)
{
//获取当前的压力值
int value = getPressure();
//利用反射找打show方法
//1:找到字节码文件
jclass cClass = (*env)->FindClass(env, "com/demo/ccalljava/MainActivity");
//2:找到方法id
//show是调用java方法的名字, (I)V是该方法的签名
jmethodID methodID = (*env)->GetMethodID(env,cClass, "showValue", "(I)V");
//3:调用方法
(*env)->CallVoidMethod(env, obj, methodID, value);
sleep(1);
}
}
/*
* Class: com_demo_ccalljava_MainActivity
* Method: stopMonitor
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_demo_ccalljava_MainActivity_stopMonitor
(JNIEnv *env , jobject obj)
{
monitor = 0;
}
3:加载动态库
static
{
System.loadLibrary("CCallJava");
}4:开始监控显示:
当按下开始后,出现了卡死GUI,这是因为startMonitor是跑在主线程的,所以卡住GUI
5:修改,startMonitor运行在子线程
//开始监控button
public void start(View v)
{
Thread thread = new Thread()
{
@Override
public void run() {
startMonitor();
}
};
thread.start();
}
6:运行再次显示效果:
可以正常显示。
相关文章推荐
- Android 加载对话框的实现
- 查看android 源码版本
- android bitmap compress(图片压缩)
- Android sqlLite 开源框架
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- 为什么Android的图片质量没有iOS的高?
- Android TextView 状态切换时变化文字颜色
- android-ndk r10环境搭建
- Android实现浮层的上下滑动(支持内部添加View)
- 图标左右抖动动画
- 利用ADB Root权限破解锁屏密码(原)
- Android(java)学习笔记183:判断SD卡状态和存储空间大小
- Android RSA加密解密
- [置顶] Android应用程序签名
- Android ListView异步加载图片乱序问题,原因分析及解决方案
- Android之如何使用javascript调用android代码
- Android 自定义View解决引导,操作指导等操作,你还在用ViewPager么?
- Android 自定义View解决引导,操作指导等操作,你还在用ViewPager么?
- android 点滴——JSON