`
dingran
  • 浏览: 376167 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android原理之开创java世界(JNI Invocation API)

阅读更多

        在Android的世界中,由名称为app_process的C++本地应用程序(路径为:framework/base/cmds/app_process/app_main.cpp)调用JNI Invocation API 在自身进程中加载dalvikvm虚拟机,这样就开创了java世界.

        现在就简单的Demo一下这个原理,在Ubuntu11.10的终端中操作,已安装了jdk的条件。

 

1.首先创建一个工作目录:

 

     mkdir javaVMTest 

2.创建一个java文件,Called.java,内容:

 

 

public class Called
{
    public static void main(String[] args)
    {
     // 把参数打印出来
    System.out.println(args[0]);

    }



}

 3.编译这个java文件为class文件:

 

     javac Called;

 

    生成的Called.class就在当前目录下。

 

4.编写本地的C/C++程序,此处以C为例,名字为:invocationApi.c

 

 

 

#include <jni.h>       /* where everything is defined */

int main()
{
    JavaVM *vm;       /* denotes a Java VM */
    JNIEnv *env;       /* pointer to native method interface */
    JavaVMInitArgs vm_args; /* JDK 6 VM initialization arguments */
    JavaVMOption* options = new JavaVMOption[1];
    //options[0].optionString = "-Djava.class.path=/usr/lib/java";
    options[0].optionString = "-Djava.class.path=/home/joy/android4.0.3/external/javaVMTest";
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 1;
    vm_args.options = options;
    vm_args.ignoreUnrecognized = false;



    /* load and initialize a Java VM, return a JNI interface 
     * pointer in env */
    JNI_CreateJavaVM(&vm, (void**)&env, &vm_args);
    //delete options;
    
    jclass cls = (*env).FindClass("Called");
    //printf("%p  %d %d\n",cls,size,a);
    printf("%p \n",cls);
    jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");

    jstring jstr = env->NewStringUTF("Hello JNI Invocation API !!!");
    jclass stringClass = env->FindClass("java/lang/String");
    jobjectArray args = env->NewObjectArray(1,stringClass,jstr);

    env->CallStaticVoidMethod(cls, mid, args);


    /* We are done. */
    vm->DestroyJavaVM();

    return 0;
}

 

 

5.编译这个c文件,先要找到jdk的位置:

 

 

   which javac;

 

   这样jdk的位置就能找到了,一般都在/usr/lib/jvm下

 

   这里就用/usr/lib/jvm/java-6-sun-1.6.0.16/来代替了。实际我的是31,呵呵。

 

 

6.找到libjvm.so这个东东是关键。

 

   一般都在jdk路径下面的:/jre/lib/amd64/server或者是什么i386等等的,

 

  用find -name "libjvm.so"能很快找到。

 

 

7.配置编译时连接库:

 

   在当前终端中,执行:

 

   export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-sun-1.6.0.16 /jre/lib/amd64/server

 

 

8.执行编译命令:

 

   g++ -I /usr/lib/jvm/java-6-sun-1.6.0.16 /include -I /usr/lib/jvm/java-6-sun-1.6.0.16 /include/linux -ljvm -L/usr/lib/jvm/java-6-sun-1.6.0.16 /jre/lib/amd64/server invocationApi.c

 

9.运行结果:

 

  运行编译出的a.out:

 

  ./a.out

 

   如果正常情况下结果为:

 

joy@joy-top:~/android4.0.3/external/javaVMTest$ ./a.out
Hello JNI Invocation API !!!
joy@joy-top:~/android4.0.3/external/javaVMTest$

 

 

10.恭喜你,刚刚创造了一个java世界!

 

 

 

0
0
分享到:
评论
2 楼 yzyspy 2012-10-09  
不错不错!虽然很简单,但是做起来还是会遇到很多苦难的
1 楼 ITboss 2012-10-09  

相关推荐

    Android C、Java、JNI效率测试结果.doc

    Android C、Java、JNI效率测试结果分析 Android 操作系统中,效率测试是一个非常重要的方面,特别是在使用 JNI(Java Native Interface)调用 C 语言时。这个文档描述了 Android G1 环境中,C、Java、JNI 调用(C ...

    JNI_API.rar_android jni api_jni_jni api_jni api_jni api chm

    JNI(Java Native Interface)...总结来说,"JNI_API.rar"提供的文档是学习和开发Android JNI应用的重要参考资料,涵盖了JNI的核心概念、使用方法和API细节,对于需要进行Java与本地代码交互的开发者来说是必不可少的。

    JAVA使用JNI读写INI文件

    JAVA使用JNI读写INI文件的实例。 JAVA本身并没有读写INI文件的现成方法,有些人自己编写方法来读写INI文件,但是这样的方法或多或少的存在着一些问题。...通过此例子程序再进行推敲就可以对JAVA用JNI调用API的功能。

    jniAPI JAVA的JNI编写帮助文档

    这个"jniAPI JAVA的JNI编写帮助文档"包含了关于如何使用JNI API来开发混合模式的Java应用的详细信息。 JNI的核心概念包括以下几个方面: 1. **本地方法接口(Native Method Interface)**: JNI定义了一组函数,...

    jni.rar_Android jni_JAVA串口 JNI_android_android RS232_jni

    然而,对于某些特定的硬件交互,如串口通信(RS232),原生Java API往往无法满足需求,这时就需要借助JNI(Java Native Interface)来实现。本文将详细讲解如何在Android应用中使用JNI封装串口通讯,并通过Java调用...

    android JNI C 调用Java

    Android JNI(Java Native Interface)是Android系统提供的一种机制,它允许Java代码调用C/C++原生代码,同时也允许C/C++代码调用Java的方法。JNI在开发高性能、低级硬件交互、使用现有C库或者优化性能的关键部分时...

    Android JNI多线程编程回调JAVA函数

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在处理性能敏感的任务,如图形渲染、硬件访问或者与C/C++库集成时,尤其有用。本话题将深入探讨如何...

    JAVA通过JNI调用C#dll的整个项目工程

    Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...

    Qt for Android 用JNI来使C++和Java互调(目前最新版全网只有这个可用)

    "Qt for Android 用JNI来使C++和Java互调"的主题揭示了如何利用JNI(Java Native Interface)技术在Qt与Android原生系统之间建立桥梁,实现两者的交互。以下将详细介绍这一过程。 首先,Qt for Android是Qt项目的一...

    Java JNI 调用C++ API/dll 示例程序

    完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接。...

    serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_

    在Android平台上进行硬件交互,例如串口通信,通常需要借助JNI(Java Native Interface)技术,因为Android的Dalvik/ART虚拟机不直接支持底层硬件访问。`serial_jni_largestgle_Androidjni_Android串口操作JNI代码_...

    androidjni编程,java和c层的互相通信传递数据

    - 实现`本地方法`:在C/C++源文件中实现这些函数,使用JNIEnv指针和JNI函数调用来与Java世界交互。 - 编译和链接:使用NDK(Native Development Kit)将C/C++源文件编译为共享库(`.so`文件)。 - 集成到Android...

    Java再说JNI之实例

    JNI在Java世界中扮演着重要角色,它允许Java程序调用C/C++等本地代码,反之亦然,使得Java应用可以利用底层系统的特性和效率。本文将深入介绍JNI的使用和实例,帮助开发者更好地理解和应用这一技术。 首先,我们...

    jni.zip_java jni_jni_jni-api_jni方面的书

    Java本地接口(JNI,Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言写的代码进行交互。JNI在很多场景下都非常有用,比如当需要调用已有的C/C++库,或者利用硬件特性,或者优化性能时。本...

    android_stduio_serial_jni_api

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与本地(C/C++)代码进行交互。在"android_stduio_serial_jni_api"这个主题中,我们将深入探讨如何在Android Studio中使用JNI来实现...

    Android JNI native调用 java层demo TESTJNI.zip

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言写的代码进行交互,尤其是C和C++。JNI在许多场景下非常有用,例如优化性能、利用硬件特性、接入第三方库等。本文将深入...

    Android13 增加 APP->JNI ->HAL

    在Android系统中,APP(应用程序)与硬件交互通常通过JNI(Java Native Interface)和HAL(Hardware Abstraction Layer)层来实现。随着Android13的发布,这个交互过程得到了进一步优化和增强,使得APP能更高效、...

    关于java加载JNI之后无法切换输入法的资料。

    Java Native Interface (JNI) 是Java平台提供的一种标准方式,允许Java代码和其他语言写的代码进行交互。当Java程序加载了JNI库后,可能会遇到输入法无法切换的问题,这通常是由于系统资源管理或者线程上下文切换...

Global site tag (gtag.js) - Google Analytics