下载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 学习笔记 android JNI 学习笔记.doc
JNI学习笔记,对学习android帮助极大
做为Android JNI还未入门的同志们,我这个总结的文档对你们真的很有用处,几乎大部分常规的Java访问C/C++以及C/C++访问Java的内容都包含在内。
JNI学习笔记 jni开发资料 使用Android studio 写JNI,适合初学者入门学习
项目四 多线程文件下载 25 项目五 Android自定义树形菜单 26 项目六 高仿微信聊天 26 ...学习四 Android and MCU Communication 43 一、 uses USB via FTDI serial card 43 二、 uses Uart(through JNI) 44
NULL 博文链接:https://cherishlc.iteye.com/blog/1756762
JNI的学习笔记,多看看,很久没看就忘记了.
JNI 编程教程,新手必备 Android JNI/NDK 学习笔记
学习韦东山老师的4412开发板视频,做了点笔记,发出来跟大家分享一下这个学习的过程。学习韦东山老师的4412开发板视频,做了点笔记,发出来跟大家分享一下这个学习的过程
问得好,这个项目乃是:ayo库的测试工程,ayo库的sample,开源工程质量检验,常见问题收集,个人学习笔记,代码模板,可复用demo等的集合, 总之,就是很牛逼!本项目的唯一目的就是吓尿你! 如何添加你的代码? 分...
方法: ... 您可能感兴趣的文章:Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库详解Android JNI的基本使用(CMake)详解Android studio ndk配置cmake开发native Ccmake 学习笔记CentO
入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的。