jni使用基础(八)之jni使用流程及C调用java简单说明

 

jni使用步骤:

1.定义好native接口。

2.使用javah工具,生成头文件。

3.根据头文件,创建c文件。

4.编写Android.mk文件。

5.通过cygwin,进入到该工程目录,通过ndk-buld命令,编译c文件,生成so库文件

6.即可完成调用

 

 

怎样在c中调用java?

也就是要在c代码中,new出java对象,然后再调用java对象中的方法即可。

要创建java对象,就要找到java类,相当于找到类的class文件,使用jni中的

FindClass去找到相应的类,然后再调用相应的方法。

简单代码:

//new 出java对象
	jclass clazz = (*env)->FindClass(env,"com/devchina/ndk4/DevchinaProvider");//注意:不能为“.”
	//获取类中的方法
	jmethodID j_method = (*env)->GetMethodID(env,clazz,"helloFromJava","()V");//最后一个参数是表示方法的签名
	(*env)->CallVoidMethod(env,obj,j_method);//第二个参数表示调用的类对象

 

 

 

怎样获得java类方法中的签名:

通过javap -s com.devchina.ndk4.devchinaActivity可以显示出方法的签名。

其中Sigature:后面的就是方法的签名。

 

 

注意:c调用java,一般是把native的方法,放到c需要回调的java类中。这样就能直接把该类的对象

           传递给c了。

例:

JNIEXPORT void JNICALL Java_com_devchina_ndk4_DevchinaProvider_callCcode
  (JNIEnv * env, jobject obj){//ojb,谁调用了此Native方法,这个Obj就是谁,这个要在回调就去中使用,所以要传递该方法所在的类对象。
	//new 出java对象
	jclass clazz = (*env)->FindClass(env,"com/devchina/ndk4/DevchinaProvider");//注意:不能为“.”
	if(clazz==0){//没有找到类
		LOGI("can't find devchina class");
	}else{
		LOGI("find dechina class");
	}

	//获取类中的方法
	jmethodID j_method = (*env)->GetMethodID(env,clazz,"helloFromJava","()V");//最后一个参数是表示方法的签名
	if(j_method==0){
		LOGI("can't get method");
	}else{
		LOGI("get method");
	}

	(*env)->CallVoidMethod(env,obj,j_method);//第二个参数表示调用的类对象,需要是在该类中调用native方法,传递的Obj

 

时间: 2024-08-08 05:55:18

jni使用基础(八)之jni使用流程及C调用java简单说明的相关文章

JNI编程基础(二)——Android Studio NDK开发

由于笔者目前的工作是Android开发,所以在JNI开发系列博客中穿插一篇AndroidStudio NDK开发介绍. 随着Android Studio 2.2的推出,Android Studio的NDK开发支持Cmake和ndk-build两种方式,简化了Android Studio上NDK开发流程,提升了开发效率.接下来就介绍下两种开发方式. 1. CMake CMake是一个跨平台的编译(安装)工具,支持通过用较为简单的语言来描述编译(安装)过程,最后输出适配不同平台的makefile货p

JNI编程基础(一)

JNI-Java Native Interface,是Java平台提供的一个特性,通过编写JNI函数实现Java代码调用C/C++代码以及C/C++代码调用Java代码的作用.从而达到利用不同语言的特点.为什么需要在Java中调用C/C++代码,在我看来最主要有以下三点: C/C++代码相比Java有着更高的性能 C/C++代码更难被反编译,有更好的安全性 通过JNI函数可以绕开JVM的限制,完成一些在Java层面实现不了的功能.典型的例子就是Android热修复框架AndFix 既然要实现C/

jni使用基础(七)之java调用c事例Demo

    1.界面: package com.devchina.ndk3; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class DemoActivity extends Activity { static{ System.loadLibrary("devchina"); } @Override p

Jni使用基础(一)之简单介绍说明

  JNI(Java Native Interface,JAVA原生接口)  Jni 是一个协议,用来沟通java代码和外部的本地代码(c/c++)相互调用.   为什么要进行交互?  首先,Java语言提供的类库无法满足要求,且在数学运算,实时渲染的游戏上,音视频处理等方面上与C/C++相比效率稍低.   然后,Java语言无法直接操作硬件,C/C++代码不仅能操作硬件而且还能发挥硬件最佳性能.  接着,使用Java调用本地的C/C++代码所写的库,省去了重复开发的麻烦,并且可以利用很多开源的

jni使用基础(九)之c调用java事例demo

      1.Activity package com.devchina.ndk4; import android.app.Activity; import android.os.Bundle; import android.view.View; public class DevchinaActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(s

01_JNI是什么,为什么使用,怎么用JNI,Cygwin环境变量配置,NDK案例(使用Java调用C代码),javah命令使用

1 什么是JNI JNI Java本地开发接口 JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(C/C++) 通过这个协议,java代码就可以调用外部的C/C++代码,外部的C/C++代码也可以调用Java代码. 2 为什么用JNI 1  JNI扩展了java虚拟机的能力,驱动开发(wifi-hotspot)2.3无线热点共享 2  Native code效率高,数学运算,实时渲染的游戏上,音视频处理(极品飞车),opengl,ffmpeg 3  复用代码(文件压缩,人脸识别)

Bootstrap <基础八>图片

原文:Bootstrap <基础八>图片 Bootstrap 提供了三个可对图片应用简单样式的 class: .img-rounded:添加 border-radius:6px 来获得图片圆角. .img-circle:添加 border-radius:500px 来让整个图片变成圆形. .img-thumbnail:添加一些内边距(padding)和一个灰色的边框. 请看下面的实例演示: <!DOCTYPE html> <html> <head> <

jni调用java方法报错!!!

问题描述 jni调用java方法报错!!! 12-04 11:33:08.818: A/art(23825): art/runtime/check_jni.cc:70] JNI DETECTED ERROR IN APPLICATION: calling static method java.lang.String com.library.utils.MD5Utils.md5(java.lang.String) with CallObjectMethod 12-04 11:33:08.818:

为什么C++通过JNI调用JAVA类函数速度慢近十倍?

问题描述 很不解,多谢了.实在对不住,积分所剩不多. 问题补充:兄台误会我意思了,主要我没说清楚.我是指Java类中的某个函数的执行时间在C++中通过JNI方式调用执行要比通过Java传统方式执行要慢很多.wkfighting 写道 解决方案 建议你在论坛问问他RednaxelaFX解决方案二:将java类中的方法执行两次,估计第二次时间就正常了.我猜测是Java类的延迟装载造成第一次调用慢了,你可以试试看,不知道我猜测的对不对?解决方案三:你是什么样的代码呢?能再说具体一点吗?JVM本身也有优