在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世界!
相关推荐
Android C、Java、JNI效率测试结果分析 Android 操作系统中,效率测试是一个非常重要的方面,特别是在使用 JNI(Java Native Interface)调用 C 语言时。这个文档描述了 Android G1 环境中,C、Java、JNI 调用(C ...
JNI(Java Native Interface)...总结来说,"JNI_API.rar"提供的文档是学习和开发Android JNI应用的重要参考资料,涵盖了JNI的核心概念、使用方法和API细节,对于需要进行Java与本地代码交互的开发者来说是必不可少的。
JAVA使用JNI读写INI文件的实例。 JAVA本身并没有读写INI文件的现成方法,有些人自己编写方法来读写INI文件,但是这样的方法或多或少的存在着一些问题。...通过此例子程序再进行推敲就可以对JAVA用JNI调用API的功能。
这个"jniAPI JAVA的JNI编写帮助文档"包含了关于如何使用JNI API来开发混合模式的Java应用的详细信息。 JNI的核心概念包括以下几个方面: 1. **本地方法接口(Native Method Interface)**: JNI定义了一组函数,...
然而,对于某些特定的硬件交互,如串口通信(RS232),原生Java API往往无法满足需求,这时就需要借助JNI(Java Native Interface)来实现。本文将详细讲解如何在Android应用中使用JNI封装串口通讯,并通过Java调用...
Android JNI(Java Native Interface)是Android系统提供的一种机制,它允许Java代码调用C/C++原生代码,同时也允许C/C++代码调用Java的方法。JNI在开发高性能、低级硬件交互、使用现有C库或者优化性能的关键部分时...
在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在处理性能敏感的任务,如图形渲染、硬件访问或者与C/C++库集成时,尤其有用。本话题将深入探讨如何...
Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...
"Qt for Android 用JNI来使C++和Java互调"的主题揭示了如何利用JNI(Java Native Interface)技术在Qt与Android原生系统之间建立桥梁,实现两者的交互。以下将详细介绍这一过程。 首先,Qt for Android是Qt项目的一...
完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接。...
在Android平台上进行硬件交互,例如串口通信,通常需要借助JNI(Java Native Interface)技术,因为Android的Dalvik/ART虚拟机不直接支持底层硬件访问。`serial_jni_largestgle_Androidjni_Android串口操作JNI代码_...
- 实现`本地方法`:在C/C++源文件中实现这些函数,使用JNIEnv指针和JNI函数调用来与Java世界交互。 - 编译和链接:使用NDK(Native Development Kit)将C/C++源文件编译为共享库(`.so`文件)。 - 集成到Android...
JNI在Java世界中扮演着重要角色,它允许Java程序调用C/C++等本地代码,反之亦然,使得Java应用可以利用底层系统的特性和效率。本文将深入介绍JNI的使用和实例,帮助开发者更好地理解和应用这一技术。 首先,我们...
Java本地接口(JNI,Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言写的代码进行交互。JNI在很多场景下都非常有用,比如当需要调用已有的C/C++库,或者利用硬件特性,或者优化性能时。本...
在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与本地(C/C++)代码进行交互。在"android_stduio_serial_jni_api"这个主题中,我们将深入探讨如何在Android Studio中使用JNI来实现...
在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言写的代码进行交互,尤其是C和C++。JNI在许多场景下非常有用,例如优化性能、利用硬件特性、接入第三方库等。本文将深入...
在Android系统中,APP(应用程序)与硬件交互通常通过JNI(Java Native Interface)和HAL(Hardware Abstraction Layer)层来实现。随着Android13的发布,这个交互过程得到了进一步优化和增强,使得APP能更高效、...
Java Native Interface (JNI) 是Java平台提供的一种标准方式,允许Java代码和其他语言写的代码进行交互。当Java程序加载了JNI库后,可能会遇到输入法无法切换的问题,这通常是由于系统资源管理或者线程上下文切换...