android jni c调用java,Android学习JNI,使用C调用JAVA语言

本节学习使用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

#include

#include

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:开始监控显示:

0818b9ca8b590ca3270a3433284dd417.png

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

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

//开始监控button

public void start(View v)

{

Thread thread = new Thread()

{

@Override

public void run() {

startMonitor();

}

};

thread.start();

}

6:运行再次显示效果:

0818b9ca8b590ca3270a3433284dd417.png

可以正常显示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值