首先,这里所要讲的主要是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相关推荐

  1. android c回调java_android使用c通过jni回调java

    很多场合都有这样的需求,由于以前都是java调用c的接口,没有做过回调,今天花了大半天时间把这个流程跑通了,记录一下,以备后用.这里发句牢骚,那些网上分享出来的代码,请问你们确实是能正常工作吗?还有查 ...

  2. android jni 回调 java_android linux线程通过JNI回调java函数 | 学步园

    Linux线程通过JNI回调JAVA函数 最近做的一个小工程需要用到回调函数,由linux层回调到java层,调试的时候会遇到一些问题,免得忘记,在这里记录一下: JNI的各种数据类型和数据结构我就不 ...

  3. nubia ui 5.0 android,国内首家 基于安卓5.0开发nubia UI公测

    [PConline 资讯]3月9日最新消息,受安卓5.0的吸引和Moto在国内使用Android 5.0原生系统的影响,国内手机厂商也纷纷推出基于Android 5.0的系统升级,其中nubia手机的 ...

  4. delphi android jni,Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用...

    一.Android平台编程方式: 1.基于Android SDK进行开发的第三方应用都必须使用Java语言(Android的SDK基于Java实现) 2.自从ndk r5发布以后,已经允许完全用C/C ...

  5. android jni 调用 java_Android与JNI(二) ---- Java调用C++ 动态调用

    目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 Android与JNI( ...

  6. Android之SDK、NDK、JNI和so文件

    Android之SDK.NDK.JNI和so文件 1.     SDK Android SDK(AndroidSoftware Development Kit),即Android软件开发工具包,And ...

  7. Android JNI(一)——NDK与JNI基础

    前言 ndk开发是高级Android 开发必备的技能,也是很多Android开发工程师难以逾越的门槛,因此,学习ndk开发已经是高级Android必备技能,所以我尝试把自己ndk开发经验记录下来,不知 ...

  8. OSG for Android新手教程系列(四)——JNI与NDK的使用

    上一篇教程中,我针对一个最简单的HelloWorld示例进行了详细讲解,从宏观上讲明了OSG for Android项目的开发方法.这里给出链接:http://blog.csdn.net/dongzh ...

  9. Android NDK开发之一:NDK与JNI基础

    一.导读 在Android OS上开发应用程序,Google提供了两种开发包:SDK和NDK.你可以从Google官方查阅到有许多关于SDK的优秀书籍.文章作为参考,但是Google提供的NDK资源, ...

最新文章

  1. Nestjs OpenAPI(Swagger)
  2. windows10删除更新的程序
  3. 在python子程序中、使用关键字_Python 的控制和函数
  4. 【详解!思路清晰】1095 解码PAT准考证 (25分)
  5. 【读书笔记《Android游戏编程之从零开始》】6.Android 游戏开发常用的系统控件(TabHost、ListView)...
  6. 【转】TCP和UDP的区别
  7. 【LeetCode】分类刷题 之 栈和队列
  8. JAVA进阶教学之(String类的构造方法)
  9. 百度SEO站群給WordPress加音乐插件源码
  10. 【英语学习】【Daily English】U10 Education L02 I'm not a pushy parent
  11. 【upstream】Nginx配置upstream实现负载均衡
  12. Django之POST GET与前后端交互
  13. CentOS 7.6安装使用Ansible(三):Ansible Playbook和变量类型
  14. 补充:消除epsilon产生式等
  15. 分布式协调服务——Zookeeper入门
  16. Thinkpad 笔记本电源状态指示灯
  17. asp.net是什么?
  18. ANDROID 绘制 三角形 XML
  19. 不可不知的潮流文化、新词汇, 00后聊天词汇
  20. 【物联网中间件平台-05】YFIOs策略开发指南

热门文章

  1. CF16A Flag
  2. POJ 3928 amp; HDU 2492 Ping pong(树阵评价倒数)
  3. 2.2_ 4_ FCFS、SJF、 HRRN调度算法
  4. python内存池机制_看过来啦!教你用Python进行内存管理
  5. mysql查询数据为0的所有字段6_MySQL8.0 初级学习笔记(六)查询数据
  6. 显示当前没有家庭组计算机,已创建家庭组且加入家庭组,但显示“当前没有其他可用的家庭组计算机?”...
  7. opencv2.4.9报错找不到opencv_video249d.dll
  8. 吴恩达《机器学习》学习笔记一——初识机器学习
  9. Swagger 注解~用于方法
  10. Spring Data JPA 从入门到精通~实际工作的应用场景