博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android JNI之C/C++层调用JAVA
阅读量:4702 次
发布时间:2019-06-09

本文共 3483 字,大约阅读时间需要 11 分钟。

从C/C++层调用JAVA层代码步骤:

1. 在JAVA类中创建java方法和本地方法

public class TestNdk{
int a;//本示例中将被修改的JAVA变量 Handler handler; public TestNdk(Handler handler){ this.handler = handler; setUp(); } public native void setUp();//本地方法 public native static int getStringFromNative();//本地方法 public int getA() { return a; } public native void setA(int a);//本地方法 public void notifyFiledChange(){
//本示例中将被C/C++调用的JAVA方法 Message message = new Message(); Bundle bundle = new Bundle(); bundle.putInt("a",a); message.setData(bundle); message.what=1; handler.sendMessage(message); } static { System.loadLibrary("MyJni");//导入生成的链接库文件 }}

2.在JNI文件夹下创建类对应的.h文件(可通过JAVAH命令生成该类的.h文件,就不赘述了),创建.cpp文件(用于编写C/C++层的代码)

.h文件:

#ifndef _Included_com_x_mp4player_TestNdk#define _Included_com_x_mp4player_TestNdk#ifdef __cplusplusextern "C" {#endif/* * Class:     com_x_mp4player_TestNdk * Method:    setUp * Signature: ()V */JNIEXPORT void JNICALL Java_com_x_mp4player_TestNdk_setUp  (JNIEnv *, jobject);/* * Class:     com_x_mp4player_TestNdk * Method:    setA * Signature: (I)V */JNIEXPORT void JNICALL Java_com_x_mp4player_TestNdk_setA        (JNIEnv *env, jobject thiz,jint i);/* * Class:     com_x_mp4player_TestNdk * Method:    getStringFromNative * Signature: ()I */JNIEXPORT jint JNICALL Java_com_x_mp4player_TestNdk_getStringFromNative  (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif

.cpp文件

#include 
#include
jobject m_object;jmethodID m_mid;jfieldID m_fid;JNIEXPORT jint JNICALL Java_com_x_mp4player_TestNdk_getStringFromNative (JNIEnv *env, jclass cls) { return 1;}JNIEXPORT void JNICALL Java_com_x_mp4player_TestNdk_setUp (JNIEnv *env, jobject thiz) { jclass clazz = (*env).GetObjectClass(thiz);//获取该对象的类 m_object = (*env).NewGlobalRef(thiz);//创建对象的本地变量 m_mid =(*env).GetMethodID(clazz, "notifyFiledChange", "()V");//获取JAVA方法的ID m_fid = (*env).GetFieldID(clazz,"a","I");//获取java变量的ID return;}JNIEXPORT void JNICALL Java_com_x_mp4player_TestNdk_setA (JNIEnv *env, jobject thiz,jint i) { (*env).SetIntField( m_object, m_fid,i); (*env).CallVoidMethod(m_object,m_mid); return;}

3.调用JAVA方法需要类的对象

在C/C++层获取类的对象的方法有两种:

  • 通过JAVA层调用本地方法(如示例中的setUp()方法),在调用时,会传入对象jobject或者对象的类jclass

JNIEXPORT void JNICALL Java_com_x_mp4player_TestNdk_setUp        (JNIEnv *env, jobject thiz) {    ...    jclass clazz = (*env).GetObjectClass(thiz);//获取该对象的类    ...    return;}
  • 通过C/C++创建java对象

方法如下:

1.通过JAVA层的本地方法创建同类对象

步骤:

I.通过对象获取类

II.通过类获取类的构造方法的ID

III.基于方法ID和类,创建新对象

JNIEXPORT void JNICALL JAVA_nativeMethod        (JNIEnv *env, jobject thiz,jint i){    ...    jclass clazz = (*env).GetObjectClass(thiz);    jmethodID mid = (*env).GetMethodID(clazz,"
","()V"); jobject obj = (*env).NewObject(clazz,mid); ... return;}

2.通过C/C++创建不同类对象

步骤:

I.通过FindClass方法获取需要的类

II.通过类获取类的构造方法的ID

III.基于方法ID和类,创建新对象

JNIEXPORT void JNICALL JAVA_nativeMethod        (JNIEnv *env, jobject thiz,jint i){    ...    jclass clazz = (*env).FindClass("com/x/test/Test");//参数为类路径    jmethodID mid = (*env).GetMethodID(clazz,"
","()V"); jobject obj = (*env).NewObject(clazz,mid); ... return;}

3.通过C++直接创建

4.调用java方法的步骤:

  1. 获取类的方法ID
  2. 基于对象和方法id调用JAVA方法

  • 示例中是java调用本地方法setUp后,调用本地方法setA(int i),在本地方法setA(int i)中调用JAVA方法notifyFiledChange()方法

5.C/C++直接存取JAVA变量

  1. 获取对象的变量的ID
  2. 基于对象和变量id存取变量

 

转载于:https://www.cnblogs.com/zhujiabin/p/10605730.html

你可能感兴趣的文章
YTU 2987: 调整表中元素顺序(线性表)
查看>>
JSP中文乱码
查看>>
Apache
查看>>
XE8 (RTM) Android SDK 更新安装
查看>>
ROS之rviz显示历史运动轨迹、路径的各种方法(visualization_msgs/Marker、nav_msgs/Path)...
查看>>
SCP-bzoj-1079
查看>>
Python 实践项目 游戏
查看>>
AJAX--Jquery
查看>>
模拟新浪微博随便看看
查看>>
环境搭建
查看>>
解密EXL
查看>>
简易版cnlog
查看>>
erlang程序运行的几种方式
查看>>
堆heap和栈Stack(百科)
查看>>
html5页面实现点击复制功能
查看>>
mac os设置root密码
查看>>
MSSQL—行转列
查看>>
Int类型空判断
查看>>
关于闭包的作用,以及优缺点
查看>>
【CF809E】Surprise me! 树形DP 虚树 数学
查看>>