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 <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:运行再次显示效果:

可以正常显示。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-29 01:29:06

Android学习JNI,使用C调用JAVA语言的相关文章

基于 Android NDK 的学习之旅----- C调用Java

http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html 基于 Android NDK 的学习之旅----- C调用Java许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法. 1.主要流程 1.  新建一个测试类TestProvider.java a)       

Android JNI c/c++调用java 无需新建虚拟机

近期通过研究SDL源码 得出android JNI  c/c++调用java 无需新建虚拟机: 具体步骤如下 第一步获得:两个参数 JNIEnv和jclass void Java_com_Test_Audio_Init( JNIEnv* env,jclass cls, jobject thiz ) { InitJNI(env,cls); } bool InitJNI(JNIEnv* env,jclass cls) { m_Env=env; m_cls=cls; } 第二步 获得java那边定义的

2018最值得学习的编程语言是什么?Java语言

很多时候大家都在思考我要不要学点什么?很多想进入IT行业的朋友,把眼光瞄准了编程语言,现在的编程语言市场也很热闹,竞争也很激烈,编程语言也是多种多样,市场上受欢迎的编程语言也有很多,比如Java .JavaScript.C#.PHP.Python等等.2018最值得学习的编程语言是什么?Java语言. 这么多受欢迎的编程语言,势必得选择一门热门的编程语言进行学习,毕竟人的精力是有限的,先学好一门再学另一门编程语言,没问题也会变得简单,但是同时开启两门或者两门以上的编程语言学习,可能得到的结果就是

Android的WebView通过JS调用java代码

做项目时候会遇到我们用WebView 打开一个web,希望这个web可以调用自己的一些方法,比如我们在进一个web页面,然后当我们点击web上的某个按钮时,希望能判断当前手机端是否已经登录,如果未登录,那么就会跳转到登录页面(登陆页面是另一个Activity).这个时候,一个简单的做法就是在按钮动作事件的js上调用java的方法,从而起到判断是否登录,并决定是否跳转到另一个页面. Google的WebView为我们提供了 addJavascriptInterface(Object obj, St

Android学习Scroller(二)——ViewGroup调用scrollTo()

MainActivity如下: package cc.ac; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.app.Activity; /** * Demo描述: * 对ViewGroup调用sc

Android学习Scroller(一)——View调用scrollTo()的理解及使用

MainActivity如下: package cc.uu; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.app.Activity; /** * Demo描述: * scrollTo()和scrollB

Android 学习JNI,用JAVA调用C

首先必须知道JNI是什么东东? JNI(Java Native Interface)是java本地语言接口,也就是提供一种方法可以用JAVA调用底层语言(C/C++).一般如果项目必须使用C语言操作底层的硬件,那就必须用到JNI技术. 那既然要使用JAVA调用C语言,那必须要解决几个问题? 1:JAVA是面向对象的语言,而C是面向过程的语言 2:JAVA中的Object,String类型,Boolean类型,在C中都是没有的,那C语言是如何识别的? 其实这些JNI都给我们做好了,在JNI的头文件

cocos2d-x笔记5: 通过jni实现C++调用Java

Cocos2d-x的跨平台性很强大,但是偶尔也需要平台的原生API结合. C++在Win32平台下简单的很,C++可以直接用MFC或者调用Win32API. Ios在XCode下直接就能C++和OC混编. 而Android又一次悲剧了,C++既不是Android的原生语言,也没有IDE可以混编... 我们只好通过jni来搞. Cocos2d-x 给我们提供了JniHelper类(良心!).头文件 #include "platform/android/jni/JniHelper.h".通

Delphi XE6 for Android 让手机震动(调用Java的函数)

震动,是调用了 安卓api  JNI 里面的 函数  ,这些都是 调用java的 ,如下面的引用, uses  FMX.Helpers.Android,  Androidapi.JNI.App,  Androidapi.JNI.Os,  Androidapi.JNIBridge, FMX.StdCtrls; 还是分几步, 1  新建一个手机项目 打开xe6, file  ----  new ----FireMonkeyMobile Application-Delphi 2    选择black