要想阅读并调试下文源码,首先要确保你的NDK环境是ok的;
       编译环境:win7+Eclipse+ADT+SDK+NDK;基本用最新的就ok。
       说明下,下文代码就是一个简单的个人jni实现【挺简单的个实现,只是完整实现出来之间经历了好多曲折,记录下呵】;
       不是现成的例子,是自己学习了下jni对Java、c/c++的映射关系之后的一个实现,如有不妥请指正。
       先看一下开始到结束的流程: 【1-10步】
       1.建立普通Android工程:
 
        2.垒一个傻瓜布局,用来显示jni回传信息:

     3.手工创建jni目录-【工程根目录下】

      4.然后在jni目录下建立native实现的源文件(**.c/**.cpp);

      5.进行逻辑实现[见下文];

      6.生成相应的Android.mk文件:

      7.对Android.mk文件属性进行确认:尤其是注意源文件后缀名!!!!

      8.确认无误后通过 debug模式进行动态库(*.so)的编译、生成:此步骤处于Eclipse的C/C++视图下

而后生成相应的*.so动态库,自动嵌入到libs/armeabi目录下;
        其中obj目录下生成的是中间文件*.o;其中控制台输出的日志我还不清楚什么意思,有明白的请明示:


      9.编译无误后,切换到Eclipse的Java视图下,进行普通的Android项目运行操作:

10.正常操作后的效果演示:   
            日志效果:

真机实测效果:
     

好啦, 到现在为止,效果已经看的差不多了,那么接下来就是上代码了··
     1. 傻瓜布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="下面将显示来自jni端的返回--" /><TextViewandroid:id="@+id/show_jni_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/textView2"android:layout_below="@+id/textView2"android:layout_marginTop="77dp"android:text="此处即将显示来自jni的消息--" /><Buttonandroid:id="@+id/jni_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentRight="true"android:layout_below="@+id/textView2"android:layout_marginTop="17dp"android:text="点击此btn调用jni方法" /></RelativeLayout>

2.activity实现:很简单-点击按钮显示jni回传信息

package com.quanjin.jni;import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class QuanjinJniActivity extends Activity implements OnClickListener {private static final String TAG = "MainActivity";private Button jniButton;private TextView showJniText;//加载共享库static {System.loadLibrary("quanjin_jni");//去掉共享库的前缀lib/后缀so}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_quanjin_jni);Log.d(TAG, show());//log查看返回值。Log.d("info_out", show());jniButton = (Button) findViewById(R.id.jni_btn);showJniText = (TextView) findViewById(R.id.show_jni_text);jniButton.setOnClickListener(this);}//声明native方法  在jni中实现。private native String show();private void callback() {Log.d(TAG, " call back from native");//故意抛出一个异常留给jni处理,如果处理,java层就不会抛;不处理,java层就会抛出异常;throw new NullPointerException();}@Overridepublic void onClick(View v) {if(v.getId() == R.id.jni_btn) {//将jni返回值显示在特定控件上。showJniText.setText(show());}}}

3.最重要大部分: native部分的实现-- 看你用什么语言了C/C++都可以;只是C用JNIEve时要先解引用;

#include <string.h>
#include <jni.h>jstring
Java_com_quanjin_jni_QuanjinJniActivity_show( JNIEnv* env, jobject thiz)
{//通过此方法得到传入对象的类型信息//此时的对象,就是调用native方法的那个对象jclass jcls = (*env)->GetObjectClass(env, thiz);//根据类信息得到callback方法的methodIDjmethodID jmId = (*env)->GetMethodID(env, jcls, "callback", "()V");//调用callback方法(*env)->CallVoidMethod(env, thiz, jmId);//Java层的callback方法中抛出异常, 故此时 jni调用必然出现异常, 必须检查并处理异常;否则异常将会抛给Java层的callback方法;//而此时的Java层的callback也未捕获异常, 故:此时进程死掉;if((*env)->ExceptionCheck(env)){(*env)->ExceptionDescribe(env);(*env)->ExceptionClear(env);//清除异常;如果注销此句,异常将被抛回至Java层,即Java层中将在log中显示异常情况;}//处理异常后响应Java层的调用return (*env)->NewStringUTF(env, "show message from jni by quanjin!""\n ABCDEFGHIGKLMNOPQRSTUVWXYZ \n ""when you have watch the above messages, congratulations, you got it!");//中文貌似乱码了-- 大爷的    \\n 中文: 这是来自本人写的jni内容, 当你看到这些话的时候呢, 恭喜你, jni调用成功啦
}

说明下: 如果没接触过的同志们,可能看起来云里雾里的,阅读前先熟悉下jni的函数签名规则比较好【稍后博客继续探讨】;
   详情见代码注释。主要用Java反射,通过获得由jni传进来的对象引用,然后相继获得其他信息;
   至于拓展开来,其他业务逻辑该怎么去展开,之后博客再写一下,今天的内容主要是开个头吧~~~
          嗯 , 基本先说这么多吧; 百闻不如一试试,完整的项目就不贴出来了, 如果有需要进一步研究的请留言附邮箱地址。

建议:
     1. 我之前一直在项目过程中抽空研究C++,其实过程中既增强了自己对面向对象的理解,又可以更深入的研究Android框架源码(Java+C++);
     感觉都是差不多的,了解基础性内容不难,若真想做到融会贯通,短时间内不太容易,慢慢深入慢慢研究吧;
     2. Android源码是个好东西哦~ 无论是哪个版本的,有空的时候阅读一下,感觉真的很爽;就像你在拜读一本武林秘籍一样,你也不知道该怎么读,但是当你开始着迷的时候便一发不可收拾,太棒了!

转载于:https://www.cnblogs.com/suncoolcat/p/3339647.html

Android-JNI编程-图文解析相关推荐

  1. 【Android 系统开发】Android JNI 之 JNIEnv 解析

    . jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是 $/android-ndk-r9d/platforms/android ...

  2. Android网络编程入门解析

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  3. Android JNI 之 JNIEnv 解析

    jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是$/android-ndk-r9d/platforms/android-19 ...

  4. Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...

  5. Android JNI 编程

    JNI函数名称分为三部分: 首先是Java关键字,供Java虚拟机识别:例如Java_com_example_hellojni_HelloJni_stringFromJNI Java:关键字 com_ ...

  6. Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址      内存地址就是指针. ...

  7. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...

  8. android JNI(转)

    原文:http://jinguo.iteye.com/blog/696185 Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行 ...

  9. Android JNI开发入门之二

    在上一篇文章<Android JNI开发入门之一>中,我介绍了Android应用程序(APK)怎样通过JNI调用Native C实现的共享库.本文将进一步介绍Android应用程序通过JN ...

最新文章

  1. IDEA键盘突然失去响应
  2. Bounding box regression详解
  3. 苹果智能家居大招要来 两年一直没火真相解秘
  4. 从实例入手学习Shiro与Web的整合
  5. broker可以禁用吗 time_很多人会问Win8.1系统Runtime Broker是什么进程?可以禁用吗?带着这两个问题...
  6. 【Kafka】Kafka创建Topic的时候提示WARNING: Due to limitations in metric names, topics with a period ('.')
  7. Scorm标准学习——Scorm RTE API与数据模型
  8. 关于 Java 性能监控您不知道的 5 件事,第 1 部分
  9. Spring_day04--课程安排_回顾SSH框架知识点_SSH框架整合思想
  10. oracle 12c sp2 0667,关于数据库安装的问题SP2-0667: Message file sp1.msb not found
  11. hive 指定字段插入数据_Hive插入数据的几种常用方法
  12. qt调用SSDP协议
  13. ▶GODOT 101
  14. tinymce富文本编辑器(vue)
  15. Windows运行及cmd常用命令
  16. 电脑安装win10系统
  17. 清华计算机考研报考人数,2020部分院校考研报考人数统计
  18. H.266/VVC-VTM代码学习-帧内预测05-Angular模式下计算预测像素值xPredIntraAng
  19. 计算机高中学校在哪,瑞金职业高中计算机UI学校在哪里
  20. 详解vue路由传参的三种方式

热门文章

  1. 西贝莜面村如何建立自己的私域流量池?
  2. 二十六岁,裸辞之后,我步入了“三无”行列
  3. 开发者友好性和易用性
  4. 小米会在芯片产业异军突起吗?
  5. 电影里看到程序员一台电脑装2个显示屏,这样有什么优点?
  6. 晚上睡觉的时候应该把wifi关掉吗?
  7. 未来几十年替代手机的是什么产品?
  8. OSI参考模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)...
  9. 繁忙SQL Server上的查询计划
  10. mirror - 映射在远端节点上的档案