前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android学习JNI,使用C调用JAVA语言

Android学习JNI,使用C调用JAVA语言

作者头像
DragonKingZhu
发布2022-05-08 16:41:50
3610
发布2022-05-08 16:41:50
举报

本节学习使用C语言调用JAVA语言。在生活中比如我们某些底层的硬件必须使用C语言去编写,当C语言返回的某些数值显示在界面上时,就比如使用JNI。这样可以将C返回的值显示在界面上。

本节模拟传感器返回的值,通过进度条显示灵敏度,然后显示到界面上。

1:界面布局就补多说了。里面就2个Button,一个用于开启监控,一个用于关闭监控,一个进度条

2:Activity代码如下:

代码语言:javascript
复制
//开始监控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代码

代码语言:javascript
复制
#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:加载动态库

代码语言:javascript
复制
	static
	{
		System.loadLibrary("CCallJava");
	}

4:开始监控显示:

当按下开始后,出现了卡死GUI,这是因为startMonitor是跑在主线程的,所以卡住GUI

5:修改,startMonitor运行在子线程

代码语言:javascript
复制
//开始监控button
public void start(View v)
{
	Thread thread = new Thread()
	{
		@Override
		public void run() {
			startMonitor();
		}
		
	};
	thread.start();
}

6:运行再次显示效果:

可以正常显示。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档