`
fonter
  • 浏览: 868077 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(转)android JNI 学习笔记1

阅读更多

下载Android安安软件请到:http://code.google.com/p/andbox 

 

      JNI是Java Native Interface的缩写,译为Java本地接口。它允许Java代码和其他语言编写的代码进行交互。在android中提供JNI的方式,让Java程序可以调用C语言程序。android中很多Java类都具有native接口,这些接口由本地实现,然后注册到系统中。

      主要的JNI代码放在以下的路径中:frameworks/base/core/jni/,这个路径中的内容被编译成库libandroid_runtime.so,这是个普通的动态库,被放置在目标系统的/system/lib目录下。此外,android还有其他的JNI库。JNI中的各个文件,实际上就是普通的C++源文件;在android中实现的JNI库,需要连接动态库libnativehelper.so。

1,JNI的实现方式

     实现JNI需要在Java源代码中声明,在C++代码中实现JNI的各种方法,并把这些方法注册到系统中。实现JNI的核心是JNINativeMethod结构体。

typedef struct {
       const char* name;
       const char* signature;
       void* fnPtr;
} JNINativeMethod;

第一个变量name是Java中JNI函数的名字,第二个变量signature用字符串描述函数参数和返回值,第三个变量fnPtr是JNI函数C指针。  

      在Java代码中,定义的函数由JNI实现时,需要指定函数为native。

2,在应用程序中使用JNI,可以通过代码中/development/samples/SimpleJNI来分析:

A,分析顶层Android.mk文件

    LOCAL_PACKAGE_NAME := SimpleJNI    //生成PACKAGE的名字,在out\target\product\smdk6410\obj\APPS

    LOCAL_JNI_SHARED_LIBRARIES := libsimplejni //生成JNI共享库的名字,在....smdk6410\obj\SHARED_LIBRARIES

    include $(BUILD_PACKAGE)                   //以生成APK的方式编译

    include $(call all-makefiles-under,$(LOCAL_PATH))   //调用下层makefile

B,分析JNI目录下Android.mk文件

    LOCAL_SRC_FILES:= \                           //JNI的C++源文件
          native.cpp

    include $(BUILD_SHARED_LIBRARY)       //以共享库方式编译

3,JNI的代码实现和调用

A,native.cpp内容

     static jint add(JNIEnv *env, jobject thiz, jint a, jint b){} //定义JAVA方法add

     static const char *classPathName = "com/example/android/simplejni/Native";   //目标JAVA类路径

     static JNINativeMethod methods[] = {                   //本地实现方法列表
             {"add", "(II)I", (void*)add },
     };

    static int registerNativeMethods(JNIEnv* env, const char* className,
    JNINativeMethod* gMethods, int numMethods){}   //为调用的某个JAVA类注册本地JNI函数

    static int registerNatives(JNIEnv* env){}                //为当前平台注册所有类及JNI函数

    jint JNI_OnLoad(JavaVM* vm, void* reserved)        //为当前虚拟机平台注册本地JNI

以上三个从下到上依次调用

B,SimpleJNI.java内容

    package com.example.android.simplejni;  //JAVA包,跟文件路径对应

    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.TextView;            //需要包含的类,以便调用函数

public class SimpleJNI extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        int sum = Native.add(2, 3);                     //调用Native类的函数add,该add就是JNI函数,由CPP实现
        tv.setText("2 + 3 = " + Integer.toString(sum));
        setContentView(tv);                                //在屏幕上显示
    }
}

 class Native {
    static {
     // The runtime will add "lib" on the front and ".o" on the end of
     // the name supplied to loadLibrary.
        System.loadLibrary("simplejni");              //载入由native.cpp生成的动态库,全名是lib+simplejni+.o
    }

    static native int add(int a, int b);                  //声明动态库中实现的JNI函数add,供JAVA调用
}

    编译生成PACKAGE后,安装到MID上,运行即是2+3=5。

 

转自:http://wallage.blog.163.com/blog/static/17389624201032141818282/

分享到:
评论

相关推荐

    android JNI 学习笔记.doc

    ### Android JNI 学习笔记详解 #### 一、JNI简介 JNI(Java Native Interface)即Java本地接口,是Java平台标准的一部分,它允许Java代码和其他语言(如C、C++等)编写的本地代码进行交互。在Android开发中,通过...

    Android JNI 学习笔记

    做为Android JNI还未入门的同志们,我这个总结的文档对你们真的很有用处,几乎大部分常规的Java访问C/C++以及C/C++访问Java的内容都包含在内。

    Android学习笔记含JNI、USB和ftdi通信方式详解

    ### Android学习笔记含JNI、USB和ftdi通信方式详解 #### 项目四:多线程文件下载 在Android开发中,文件下载是一个常见的需求。利用多线程技术可以提高文件下载的速度,尤其在网络条件较差的情况下更为明显。多...

    Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

    这篇“Android学习笔记——利用JNI技术在Android中调用、调试C++代码”将带你深入理解如何在Android应用中使用JNI来调用C++代码,以及如何进行调试。以下是对这一主题的详细阐述。 1. **JNI简介** JNI是Java平台的...

    一个简单的Jni工程包括个人学习笔记

    这个压缩包的“NDK学习笔记”可能涵盖了这些内容,包括如何设置开发环境、创建和调用本地方法、处理不同类型的数据(如数组、对象等)、以及在Android中使用NDK的特定细节,如Android.mk或CMakeLists.txt构建文件的...

    jni学习源码

    在“jni学习源码”这个资料中,包含了两个关键部分:`jni学习笔记.docx`和`myNDK`。`jni学习笔记.docx`很可能是对JNI基础知识的详细讲解,包括但不限于以下内容: 1. **JNI基本概念**:解释JNI的作用,为何要在Java...

    android-ndk 学习笔记

    本笔记主要探讨了Android NDK的使用、安装、配置以及在Android应用开发中的实践。 一、Android NDK简介 NDK为开发者提供了在Android平台上进行原生代码编程的能力,这包括对底层硬件的直接访问和优化,比如图形处理...

    JNI笔记的相关内容

    #### 一、为什么学习JNI? JNI(Java Native Interface)技术能够增强Java虚拟机的功能,使得Java程序能够直接调用本地语言(如C或C++)编写的函数。这对于提高程序性能、实现特定硬件访问以及利用已有C/C++代码等...

    关于JNI详解及笔记

    JNI,全称Java Native Interface,是Java平台标准的一部分,它为Java程序员提供了一种方法,可以在Java代码中调用本地(非Java)代码,反之...学习并熟练掌握JNI,对于提升Android应用的性能和功能有着至关重要的作用。

    android开发板笔记6

    通过深入学习这些知识点,并结合提供的“read me.doc”、“新版Android开发教程+笔记十一--可视化UI设计DroidDraw.pdf”和“新版Android开发教程+笔记十二--文件存取、数据库编程.pdf”等资源,开发者可以迅速提升在...

    Android开发总结笔记

    1. **Android SDK**:Android软件开发工具包是开发Android应用的基础,包括了Java编译器、模拟器、Android平台版本以及各种开发工具,如Android Studio。 2. **Android Studio**:作为官方集成开发环境(IDE),...

    开发笔记Jni,使用gradle-experimental

    标签中的“android studio”表明这是在Android Studio开发环境下的操作,而“jni”是主要的关注点,意味着这篇开发笔记专注于Android原生接口的使用。 至于压缩包文件“MyJni”,它很可能包含了作者在博客中提到的...

    山世光老师的SeetaFace改成安卓NDK编译,可随意加jni接口

    基于seetaface的人脸识别,本人修改为安卓NDK编译程序,并扩展了,安卓调用接口,包括了检测,对齐,识别,在同一个程序中...本人笔记网址www.abdosoft.cn, 至少可以让你节省1个星期时间,包括jni学习也是很好的参考了。

    jni相关文档以及代码

    1. "JNI笔记.md" - 这可能是一个Markdown格式的文档,详细记录了关于JNI的学习笔记,包括基本概念、使用方法、示例代码等。 2. 图片文件(如2016-12-16_22-43-53.png等) - 可能是图形化的步骤说明,代码截图,或者...

    javase学习笔记(全)

    这份"javase学习笔记(全)"涵盖了刘意版传智播客课程的主要内容,是学习Java编程语言的重要参考资料。以下将对Java SE的一些关键知识点进行详细解释: 1. **Java基础**:Java的基础语法包括数据类型(如整型、浮点型...

    JNI(Java Native Interface)_02

    总结来说,这个资料包提供了一个全面的JNI学习资源,从理论到实践,包括了JNI的基本概念、函数用法、开发环境的配置、工具的使用以及逆向工程的辅助。对于想要深入理解和掌握JNI的开发者,这是一个宝贵的资料集合。

    android开发板笔记7

    【Android开发板笔记7】是针对Real6410开发板的一份详实的学习资料,旨在帮助开发者快速提升Android技术能力。这份笔记结合了实际硬件平台,深入浅出地讲解了Android系统在嵌入式设备上的应用与优化,是Android...

    andiod教程加学习笔记

    Android教程与学习笔记 Android是由Google领导的开放源代码移动操作系统,主要应用于智能手机和平板电脑,但同时也扩展到了智能手表、电视、汽车等其他设备上。Android以其开放性、灵活性和丰富的应用程序生态,...

Global site tag (gtag.js) - Google Analytics