网站首页 > 技术文章 正文
上一篇讲了jni的创建,这一篇讲java和c之间的调用。如有地方觉得突如其来可以看上一篇的内容后再看这篇。
一、java调用c语言
有时jni的native方法多的时候我们在一个个去写c方法就很烦人,此时我们可以自动生成相应的c方法。
1、我们先写好本地native方法
2、然后生成c的头文件,两种方式。
1.在\NDKDemo\app\src\main\java
执行命令:javah com.atguigu.ndkdemo.native方法所在类的全类名
命令行可以用studio的,也可以用cmd 的
2.另外一种是在项目的build/intermaediates/classes/debug/下执行
命令 : javah -classpath . -jni native方法所在类的全类名
3、把头文件移到jni目录下
4、创建一个c的源文件,然后#include "com_example_javacallc_MyJni.h"
5、然后把头文件中的方法复制过来,然后就可以写方法体了。
这里我们就用了快捷的方式生成了头文件而已,其余的和一里面一样操作。
二、c调java
我们的做法是先用java调c,让c来响应,然后在c里面写上调java的代码来实现c调java
1、java调c这和上面一样,就不赘述
2、c调java就分四步;
1. 用反射得到jclass对象:参数2是类的全名,用反斜杠代替点,因为在linux下反斜杠才代表下级路径
jclass clazz = (*env)->FindClass(env,"com/example/ccalljava/Myjni");
2. 得到对应方法的Method对象 : 参数2是类,参数3是方法名,就是要被调的java方法名,参数4是方法签名,方法签名下面有讲到。
jmethodID method = (*env)->GetMethodID(env,clazz,"add","()V");
------------方法签名start------------
在头文件中,每个方法的文档注释部分Signature就是方法签名
/*
* Signature: (Ljava/lang/String;)Ljava/lang/String ;
*/
从括号开始一个都不要漏,包括最后的分号都属于签名,画线加粗部分
如果头文件中没有可以自己手动查看
1). 在命令行窗口中, 进入classes/debug/目录
2). 执行命令: javap -s 全类名, 就会显示所有方法的签名信息
-----------方法签名end--------------
3. 创建类对象,如果是调用的静态java方法这一步就不用。
jobject obj = (*env)->AllocObject(env,clazz);
4. 调用方法,根据返回值类型来调不同的方法
(*env)->CallVoidMethod(env,obj,method);
/**调用静态方法时就不要步骤3,步骤2变成getStaticMethodID,步骤4变成CallStaticXXXMethod。**/
三、在c中打log
-------------AS中使用-------------
1. 在build.gradle中ndk配置中添加配置:ldLibs "log"
defaultConfig {
applicationId "com.atguigu.javacallc"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
moduleName "javaCallC" //so文件: lib+moduleName+.so
abiFilters "armeabi", "armeabi-v7a", "x86" //cpu的类型
ldLibs "log"
}
}
2. 包含日志头文件, 定义日志输出函数
#include <android/log.h>
#define LOG_TAG "yzy"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
3. 调用日志输出函数
LOGE("内容");
---------Eclipse中使用---------------
1. 在Android.mk中添加配置
LOCAL_LDLIBS += -llog
2. 在C文件中引入定义:
#include <android/log.h>
#define LOG_TAG "atguigu"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
3. 调用
LOGE("result=%d \n", result);
如果有误欢迎评论指出。。
猜你喜欢
- 2024-10-27 NDK开发——FFmpeg视频解码 ffmpeg ndk
- 2024-10-27 Camera基本代码架构 camera calibrator
- 2024-10-27 android 功耗分析方法和优化(1) 功耗app
- 2024-10-27 Cocos Creator v2.3.2 发布了!全新 Launcher 效率飞起!
- 2024-10-27 如何androd动态注册编写计算器 淘宝动态评分计算器在线
- 2024-10-27 高通平台OV8856 Camera的bring up总结
- 2024-10-27 高通平台移植GC2145 Camera驱动 高通驱动安装
- 2024-10-27 《坎公骑冠剑》光炮Android Mk.99技能与背景故事
- 2024-10-27 ubuntu移植libwebp到Android平台 ubuntu移植到arm
- 2024-10-27 步步为营,十分钟学会 Native JNI(附带彩蛋)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)