NDK开发c调用java代码(四)
来源:互联网 发布:材料仿真软件 vasp 编辑:程序博客网 时间:2024/05/22 03:29
c调用java代码
1.写JNI类
public class JNI {
static {
System.loadLibrary("cCallJava");
}
/*
*
* callbacSayHello()方法的目的是,触发c代码,让c代码代用sayHello()方法
* */
public native void callbacSayHello();
public static void sayHello(String s){
Log.i("我是java代码中的JNI----","java中的sayHello(string s)静态方法,我被c调用了:"+s);
}
}
2.生成对应的c代码的头文件,先build一下
在main下创建jni目录 创建c文件 new File xxx.c
先build一下
选中JNI类右键copy Reference 获取JNI全类名
点击java目录右键,show in Explore ,然后点击,进入java目录下,shift+右键,在此处打开命令窗口,javah 全类名,然后将生成的。h文件移动到jni目录下
创建c代码文件,将.h中的方法复制到相应的c代码中,,进行实现,首先将参数补全,如:
JNIEXPORT void JNICALL Java_www_basketi_cn_basketball_ccalljavademo_JNI_callbackHelloFromJava
(JNIEnv * env, jobject jb){
//在此处实现c代码
//1.得到字节码 参数二是JNI的全类名 .改成/
jclass jclazz=(*env)->FindClass(env,"www/basketi/cn/basketball/ccalljavademo/JNI");
//2.得到的对应的方法 参数三是c要掉用JNI中的方法 参数四是该方法的签名
jmethodID jmethodIDs=(*env)->GetMethodID(env,jclazz,"helloFromJava","()V");
//3.实例化JNI对象
jobject jobject=(*env)->AllocObject(env,jclazz);
//4.调用方法
(*env)->CallVoidMethod(env,jobject,jmethodIDs);
};
3.方法签名的获取
进入项目中的build\intermediates/classes/debug目录中,首先要build一下,- 右键show in explore - 按住shift + 右键- 在此处打开命令窗口 - javap -s 包名.JNI 回车
4.配置生成库的名称
配置生成库的名称:
在build.gradle中:
defaultConfig {
applicationId "www.basketi.cn.basketball.ccalljavademo"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
ndk{
moduleName "cCallJava"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
ndk{
ldLibs "log"
}
}
5.加载动态库:
可以在JNI类中加入静态代码块:
static {
System.loadLibrary("cCallJava");
}
6.调用方法
new JNI.callbackSayHello();当调用此方法的时候,就会调用c代码,c就会调用java代码,注:native方法是用来调用c代码的
备注:直接使用.so文件
1.拷贝.so文件到当前工程的main/jniLibs目录下
2.不需要配置
ndk{
moduleName "cCallJava"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
1.写JNI类
public class JNI {
static {
System.loadLibrary("cCallJava");
}
/*
*
* callbacSayHello()方法的目的是,触发c代码,让c代码代用sayHello()方法
* */
public native void callbacSayHello();
public static void sayHello(String s){
Log.i("我是java代码中的JNI----","java中的sayHello(string s)静态方法,我被c调用了:"+s);
}
}
2.生成对应的c代码的头文件,先build一下
在main下创建jni目录 创建c文件 new File xxx.c
先build一下
选中JNI类右键copy Reference 获取JNI全类名
点击java目录右键,show in Explore ,然后点击,进入java目录下,shift+右键,在此处打开命令窗口,javah 全类名,然后将生成的。h文件移动到jni目录下
创建c代码文件,将.h中的方法复制到相应的c代码中,,进行实现,首先将参数补全,如:
JNIEXPORT void JNICALL Java_www_basketi_cn_basketball_ccalljavademo_JNI_callbackHelloFromJava
(JNIEnv * env, jobject jb){
//在此处实现c代码
//1.得到字节码 参数二是JNI的全类名 .改成/
jclass jclazz=(*env)->FindClass(env,"www/basketi/cn/basketball/ccalljavademo/JNI");
//2.得到的对应的方法 参数三是c要掉用JNI中的方法 参数四是该方法的签名
jmethodID jmethodIDs=(*env)->GetMethodID(env,jclazz,"helloFromJava","()V");
//3.实例化JNI对象
jobject jobject=(*env)->AllocObject(env,jclazz);
//4.调用方法
(*env)->CallVoidMethod(env,jobject,jmethodIDs);
};
3.方法签名的获取
进入项目中的build\intermediates/classes/debug目录中,首先要build一下,- 右键show in explore - 按住shift + 右键- 在此处打开命令窗口 - javap -s 包名.JNI 回车
4.配置生成库的名称
配置生成库的名称:
在build.gradle中:
defaultConfig {
applicationId "www.basketi.cn.basketball.ccalljavademo"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
ndk{
moduleName "cCallJava"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
ndk{
ldLibs "log"
}
}
5.加载动态库:
可以在JNI类中加入静态代码块:
static {
System.loadLibrary("cCallJava");
}
6.调用方法
new JNI.callbackSayHello();当调用此方法的时候,就会调用c代码,c就会调用java代码,注:native方法是用来调用c代码的
备注:直接使用.so文件
1.拷贝.so文件到当前工程的main/jniLibs目录下
2.不需要配置
ndk{
moduleName "cCallJava"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
3.c代码也不需要写了
源码下载位置:http://download.csdn.net/detail/lzq520210/9733668
0 0
- NDK开发c调用java代码(四)
- NDK Java 调用 C代码
- NDK开发java调用c(三)
- ndk开发中,在c中调用java代码
- NDK 开发C中通过反射调用Java代码
- AndroidStudio NDK开发 c环境调用java代码
- 安卓JNI/NDK开发3(进阶 在C代码中调用java方法)
- Android NDK开发之C调用Java及原生代码断点调试(二)
- NDK技术,Java项目调用C代码
- Android NDK c调用java代码
- NDK开发(1)——JAVA通过JNI调用C代码详细步骤
- Android NDK开发(一)之java层调用C代码浅析
- android ndk c代码调用java的代码
- NDK学习笔记<四> C语言调用java方法
- NDK:android调用c代码
- Android NDK学习记录(二):C/C++调用Java代码
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- final、finally 和 finalize 区别
- [工具] Mysql GUI工具
- python实现堆栈和队列
- Android自定义折线图,可左右滑动,可点击
- Python实现连接操作MySql数据库
- NDK开发c调用java代码(四)
- intellij idea开发web项目部署到系统tomcat,非idea虚拟tomcat
- Manifest.xml 入门基础 (三) <uses-sdk>标签
- Java中String="hello"和new String("hello')两种创建字符串的区别
- CSDN博客专家申请成功
- MFC定时器的用法
- 启动配置tomcat8
- Java泛型获取 测试
- 微信小程序注册流程详解