下载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 学习笔记详解 #### 一、JNI简介 JNI(Java Native Interface)即Java本地接口,是Java平台标准的一部分,它允许Java代码和其他语言(如C、C++等)编写的本地代码进行交互。在Android开发中,通过...
做为Android JNI还未入门的同志们,我这个总结的文档对你们真的很有用处,几乎大部分常规的Java访问C/C++以及C/C++访问Java的内容都包含在内。
### Android学习笔记含JNI、USB和ftdi通信方式详解 #### 项目四:多线程文件下载 在Android开发中,文件下载是一个常见的需求。利用多线程技术可以提高文件下载的速度,尤其在网络条件较差的情况下更为明显。多...
这篇“Android学习笔记——利用JNI技术在Android中调用、调试C++代码”将带你深入理解如何在Android应用中使用JNI来调用C++代码,以及如何进行调试。以下是对这一主题的详细阐述。 1. **JNI简介** JNI是Java平台的...
这个压缩包的“NDK学习笔记”可能涵盖了这些内容,包括如何设置开发环境、创建和调用本地方法、处理不同类型的数据(如数组、对象等)、以及在Android中使用NDK的特定细节,如Android.mk或CMakeLists.txt构建文件的...
在“jni学习源码”这个资料中,包含了两个关键部分:`jni学习笔记.docx`和`myNDK`。`jni学习笔记.docx`很可能是对JNI基础知识的详细讲解,包括但不限于以下内容: 1. **JNI基本概念**:解释JNI的作用,为何要在Java...
本笔记主要探讨了Android NDK的使用、安装、配置以及在Android应用开发中的实践。 一、Android NDK简介 NDK为开发者提供了在Android平台上进行原生代码编程的能力,这包括对底层硬件的直接访问和优化,比如图形处理...
#### 一、为什么学习JNI? JNI(Java Native Interface)技术能够增强Java虚拟机的功能,使得Java程序能够直接调用本地语言(如C或C++)编写的函数。这对于提高程序性能、实现特定硬件访问以及利用已有C/C++代码等...
JNI,全称Java Native Interface,是Java平台标准的一部分,它为Java程序员提供了一种方法,可以在Java代码中调用本地(非Java)代码,反之...学习并熟练掌握JNI,对于提升Android应用的性能和功能有着至关重要的作用。
通过深入学习这些知识点,并结合提供的“read me.doc”、“新版Android开发教程+笔记十一--可视化UI设计DroidDraw.pdf”和“新版Android开发教程+笔记十二--文件存取、数据库编程.pdf”等资源,开发者可以迅速提升在...
1. **Android SDK**:Android软件开发工具包是开发Android应用的基础,包括了Java编译器、模拟器、Android平台版本以及各种开发工具,如Android Studio。 2. **Android Studio**:作为官方集成开发环境(IDE),...
标签中的“android studio”表明这是在Android Studio开发环境下的操作,而“jni”是主要的关注点,意味着这篇开发笔记专注于Android原生接口的使用。 至于压缩包文件“MyJni”,它很可能包含了作者在博客中提到的...
基于seetaface的人脸识别,本人修改为安卓NDK编译程序,并扩展了,安卓调用接口,包括了检测,对齐,识别,在同一个程序中...本人笔记网址www.abdosoft.cn, 至少可以让你节省1个星期时间,包括jni学习也是很好的参考了。
1. "JNI笔记.md" - 这可能是一个Markdown格式的文档,详细记录了关于JNI的学习笔记,包括基本概念、使用方法、示例代码等。 2. 图片文件(如2016-12-16_22-43-53.png等) - 可能是图形化的步骤说明,代码截图,或者...
这份"javase学习笔记(全)"涵盖了刘意版传智播客课程的主要内容,是学习Java编程语言的重要参考资料。以下将对Java SE的一些关键知识点进行详细解释: 1. **Java基础**:Java的基础语法包括数据类型(如整型、浮点型...
总结来说,这个资料包提供了一个全面的JNI学习资源,从理论到实践,包括了JNI的基本概念、函数用法、开发环境的配置、工具的使用以及逆向工程的辅助。对于想要深入理解和掌握JNI的开发者,这是一个宝贵的资料集合。
【Android开发板笔记7】是针对Real6410开发板的一份详实的学习资料,旨在帮助开发者快速提升Android技术能力。这份笔记结合了实际硬件平台,深入浅出地讲解了Android系统在嵌入式设备上的应用与优化,是Android...
Android教程与学习笔记 Android是由Google领导的开放源代码移动操作系统,主要应用于智能手机和平板电脑,但同时也扩展到了智能手表、电视、汽车等其他设备上。Android以其开放性、灵活性和丰富的应用程序生态,...