android jni 调用java_Android 基于NDK的JNI开发 C调用java和java调用C
首先,这里所要讲的主要是C调用java的,因为这里网上也没有一个详细的资料,其次,我开发android应用没多久,其中java错误敬请谅解!
关于配置NDK环境问题应该不用再赘述了,这个网上有很多,只要配置好能编译JNI的本地示例程序就可以了。
(NDK-1.6版本)
一、
这里讲一下如何自己写JNI程序,网上很多都是讲用javah自动生成,其实并没有太多必要。首先进入android-ndk-1.6_r1\apps
复制hello-jni文件夹到app目录下,更改名字为你想要的,这里就叫 test-jni,然后进入test-jni目录
,用写字板打开Application.mk
内容改为
APP_PROJECT_PATH := $(call my-dir)/project
APP_MODULES := test-jni
保存关闭。再进入project\jni目录打开 Android.mk
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
这两个更改为
LOCAL_MODULE := test-jniLOCAL_SRC_FILES := test-jni.c
同时把hello-jni.c改为test-jni.c 这样,你可以使用make APP=test-jni -B命令去编译你的jni了。
二、这里讲一下如何手动写jni代码
接着上面创建出来的jni,编译时可以通过,但无法使用,因为jni函数有一个函数名规范。打开test-jni.c 会看的
Java_com_example_hellojni_HelloJni_stringFromJNI 这个命名是有详细规范的,Java_ 开头 下面是你在java哪个类里面要使用,比如我要在com\example\hellojni下面的testjni类中使用,那就要命名为Java_com_example_hellojni_testjni_stringFromJNI。
然后是参数JNIEnv* env,jobject thiz ,这两个是默认的参数,第一个是java虚拟机,必须有,第二个可以不用,相当于当前类的对象的指针,也就是this。
里面内容的写法也有很多,无非是 一些标准C的处理了。这里要注意的是java那边的 数组类型在这边对应的都是一个类的指针,比如byte[],在c这边是JbyteArray,
要获取数组的值要用
int len =(*env)->GetArrayLength(env,msg);
jbyte* elems =(*env)-> GetByteArrayElements(env,msg, 0);
(*env)->ReleaseByteArrayElements(env,msg, elems, 0);
三、重点:C调用java。
先讲一下我理解的调用过程,c要先找到这个类,然后要有一个对象,然后在这个类的对象基础上调用这个函数。
因此调用java函数首先要有类,然后函数ID,然后对象
cls = (*env)->FindClass(env,"com/example/hellojni/Ext_Graphics");
//获取数组
mid = (*env)->GetMethodID(env,cls,"getCanvasBmpByte","()[B"); //这里的最后一个参数是用javap -s -p 命令拿到的,很多文章有讲过
msg = (jbyteArray)(*env)->CallObjectMethod(env,job, mid); //注意这里的第二个参数就是对象,意义就是你调用的是当前类的当前对象的这个方法,如果当前类没有这个函数那就直接出错了,如果你要在其他类里面调用这个方法,请把这个类的对象的引用做参数传递进来:
Java_com_example_hellojni_HelloJni_InitGraphics( JNIEnv* env,jobject thiz ,jobject job )//这个就是函数所在的对象
暂时就只有这些,具体不清楚请回我消息吧~我会解答的
发表于 @
2010年09月02日 15:16:00 | 评论( 3
)| 举报|
android jni 调用java_Android 基于NDK的JNI开发 C调用java和java调用C相关推荐
- android c回调java_android使用c通过jni回调java
很多场合都有这样的需求,由于以前都是java调用c的接口,没有做过回调,今天花了大半天时间把这个流程跑通了,记录一下,以备后用.这里发句牢骚,那些网上分享出来的代码,请问你们确实是能正常工作吗?还有查 ...
- android jni 回调 java_android linux线程通过JNI回调java函数 | 学步园
Linux线程通过JNI回调JAVA函数 最近做的一个小工程需要用到回调函数,由linux层回调到java层,调试的时候会遇到一些问题,免得忘记,在这里记录一下: JNI的各种数据类型和数据结构我就不 ...
- nubia ui 5.0 android,国内首家 基于安卓5.0开发nubia UI公测
[PConline 资讯]3月9日最新消息,受安卓5.0的吸引和Moto在国内使用Android 5.0原生系统的影响,国内手机厂商也纷纷推出基于Android 5.0的系统升级,其中nubia手机的 ...
- delphi android jni,Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用...
一.Android平台编程方式: 1.基于Android SDK进行开发的第三方应用都必须使用Java语言(Android的SDK基于Java实现) 2.自从ndk r5发布以后,已经允许完全用C/C ...
- android jni 调用 java_Android与JNI(二) ---- Java调用C++ 动态调用
目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 Android与JNI( ...
- Android之SDK、NDK、JNI和so文件
Android之SDK.NDK.JNI和so文件 1. SDK Android SDK(AndroidSoftware Development Kit),即Android软件开发工具包,And ...
- Android JNI(一)——NDK与JNI基础
前言 ndk开发是高级Android 开发必备的技能,也是很多Android开发工程师难以逾越的门槛,因此,学习ndk开发已经是高级Android必备技能,所以我尝试把自己ndk开发经验记录下来,不知 ...
- OSG for Android新手教程系列(四)——JNI与NDK的使用
上一篇教程中,我针对一个最简单的HelloWorld示例进行了详细讲解,从宏观上讲明了OSG for Android项目的开发方法.这里给出链接:http://blog.csdn.net/dongzh ...
- Android NDK开发之一:NDK与JNI基础
一.导读 在Android OS上开发应用程序,Google提供了两种开发包:SDK和NDK.你可以从Google官方查阅到有许多关于SDK的优秀书籍.文章作为参考,但是Google提供的NDK资源, ...
最新文章
- Nestjs OpenAPI(Swagger)
- windows10删除更新的程序
- 在python子程序中、使用关键字_Python 的控制和函数
- 【详解!思路清晰】1095 解码PAT准考证 (25分)
- 【读书笔记《Android游戏编程之从零开始》】6.Android 游戏开发常用的系统控件(TabHost、ListView)...
- 【转】TCP和UDP的区别
- 【LeetCode】分类刷题 之 栈和队列
- JAVA进阶教学之(String类的构造方法)
- 百度SEO站群給WordPress加音乐插件源码
- 【英语学习】【Daily English】U10 Education L02 I'm not a pushy parent
- 【upstream】Nginx配置upstream实现负载均衡
- Django之POST GET与前后端交互
- CentOS 7.6安装使用Ansible(三):Ansible Playbook和变量类型
- 补充:消除epsilon产生式等
- 分布式协调服务——Zookeeper入门
- Thinkpad 笔记本电源状态指示灯
- asp.net是什么?
- ANDROID 绘制 三角形 XML
- 不可不知的潮流文化、新词汇, 00后聊天词汇
- 【物联网中间件平台-05】YFIOs策略开发指南
热门文章
- CF16A Flag
- POJ 3928 amp; HDU 2492 Ping pong(树阵评价倒数)
- 2.2_ 4_ FCFS、SJF、 HRRN调度算法
- python内存池机制_看过来啦!教你用Python进行内存管理
- mysql查询数据为0的所有字段6_MySQL8.0 初级学习笔记(六)查询数据
- 显示当前没有家庭组计算机,已创建家庭组且加入家庭组,但显示“当前没有其他可用的家庭组计算机?”...
- opencv2.4.9报错找不到opencv_video249d.dll
- 吴恩达《机器学习》学习笔记一——初识机器学习
- Swagger 注解~用于方法
- Spring Data JPA 从入门到精通~实际工作的应用场景