在 Android 中提供 JNI 的
方式,让 JAVA 程序可以
调用 C 语言的程序。很多
Android 中 JAVA 的类都
具有 native 的接口,这些
nantive 接口就是由本地实
现,然后注册到系统中的。
android上
JAVA应用程序
||
JAVA框架
|
(声明本地接口 )
JNI
|
C/C++本地库
在 Android 中,主要的 JNI 的代码在以下的路
径中: frameworks/base/core/jni/
这个路径中的内容将被编译成为
库, libandroid_runtime.so ,这就是一个普通的动态
库,被放置在目标系统的 /system/lib 目录中。
除此之外, Android 还包含了其他的几个 JNI
的库,例如媒体部分的 JNI 在目录 frameworks/base/
media/jni/ 中,被编译成为库 libmedia_jni.so 。
JNI 中各个文件的实际上就是 C++ 的普通源文件,
其命名一般和对应支持的 JAVA 类有对应关系。这种关
系是习惯上的写法,而不是强制的。
在 Android 中实现的 JNI 库,需要连接动态库
libnativehelper.so 。
Android 中使用 JNI 主要有两种方式:
1. 在框架层实现,连接 JAVA 框架和本地框架
2. 在应用程序的 Apk 包中实现
在 Apk 包中实现过程:
1、首先创建含有native方法的Java类:
在工程的src目录下创建一个类,静态加载动态库,指定动态苦中提供的方法,这里为 add, hello两个方法。
package com.tecent.
public class NativeLib {
static {
System.loadLibrary("ndk_demo");
}
public native int add(int v1, int v2);
public native String hello();
}
2.
通过javah命令生成.h文件
在工程的bin目录 执行命令
javah -jni com.tecent.NativeLib
生成头文件
com.tecent.NativeLib.h
3. 在工程目录下
创建
jni 文件夹,拷贝生成的头文件
com.tecent.NativeLib.h
到jni文件下面。
4. 在jni目录下编写C 源文件实现具体方法
#include "com.tecent.NativeLib.h
JNIEXPORT jint JNICALL Java_com_vision_jni_NativeLib_add
(JNIEnv * env, jobject obj, jint value1, jint value2) {
return value1 + value2;
}
JNIEXPORT jstring JNICALL Java_com_vision_jni_NativeLib_hello
(JNIEnv * env, jobject obj) {
return (*env)->NewStringUTF(env, "helloworld !");
}
5. 在jni目录下写makefile文件 Android.mk
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ndk_demo //编译后的动态库名称,在 含有native方法的Java类中加载。
LOCAL_SRC_FILES := ndk_demo.c //动态苦依赖哪些源文件?
include $(BUILD_SHARED_LIBRARY) //指定生成的库类型,这里为动态苦(可指定生成动态库,静态库,还是可执行程序)
6. 编写编译整个工程的makefile
在工程的根目录创建Android.mk
TOP_LOCAL_PATH:= $(call my-dir)
# Build activity
LOCAL_PATH:= $(TOP_LOCAL_PATH)
include $(CLEAR_VARS)
#LOCAL_MODULE_TAGS := samples //生成的apk放在那个目录下
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := SimpleJNI //最终生成的apk包名字
LOCAL_JNI_SHARED_LIBRARIES := ndk_demo //这里指定加载的动态库
LOCAL_PROGUARD_ENABLED := disabled
include $(BUILD_PACKAGE) //指定生成apk包
# ============================================================
# Also build all of the sub-targets under this one: the shared library.
include $(call all-makefiles-under,$(LOCAL_PATH))
7. 在 应用层调用 本地方法
package com.vision.simplejni;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.view.View;
import com.vision.jni.NativeLib;
public class Main extends Activity {
NativeLib nativelib; //上面的包含native方法的java类NativeLib
/** Called when the activity is first created. */
@Override
pubic void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
nativelib = new NativeLib();
String hello = nativelib.hello(); //访问具体方法
TextView outText = (TextView) findViewById(R.id.TextView01);
outText.setText(hello);
}
}
参考: http://marakana.com/forums/android/examples/49.html
http://mobile.tutsplus.com/tutorials/android/ndk-tutorial/
http://www.mobisoftinfotech.com/blog/tag/android-ndk-tutorial/
分享到:
相关推荐
基于老罗的《Android内核源代码情景分析》第二章freg实例,使用NDK编译jni层从而调用驱动程序,能大大缩短项目开发周期。
分步骤描述了android jni如实开发。
详细剖析了NDK开发中涉及的各类问题和解决方案:搭建Android NDK开发环境的每一步细节,开发第一个Android NDK程序,Android NDK中Java与C/C++代码的互相调用,Facade设计模式在NDK中的美妙应用,NDK与软/硬件整合,...
《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去实现自己的Android应用中对性能要求较高的部分。 《移动开发经典丛书·Android C++高级编程:使用NDK》介绍了...
16.3 AndroidNDK开发 16.3.1 JNI接口设计 16.3.2 使用C\C++实现本地 方法 16.3 编译C\C++代码 16.4 AndroidNDK中使用0penGL 16.5小结 第17章 Android脚本环境 17.1 Android脚本环境简介 17.2 ...
16.3 AndroidNDK开发 16.3.1 JNI接口设计 16.3.2 使用C\C++实现本地方法 16.3 编译C\C++代码 16.4 AndroidNDK中使用0penGL 16.5小结 第17章 Android脚本环境 17.1 Android脚本环境简介 17.2 ...
《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去实现自己的Android应用中对性能要求较高的部分。 《移动开发经典丛书·Android C++高级编程:使用NDK》介绍了...
众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。 NDK包括了: 从C / C++生成原生代码库所需要的工具和build files。 将一致的原生库嵌入可以在Android...
16.3 AndroidNDK开发 16.3.1 JNI接口设计 16.3.2 使用C\C++实现本地 方法 16.3.3 Android.mk实现 16.3.4 Application.mk实现 16.3.5 编译C\C++代码 16.4 AndroidNDK中使用0penGL 16.5小结 第17章 Android脚本环境 ...
《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去实现自己的Android应用中对性能要求较高的部分。 《移动开发经典丛书·Android C++高级编程:使用NDK》介绍了...
Android之NDK开发 一、NDK产生的背景 Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第...
Android开发指南中文版-应用程序框架,Android驱动开发入门及手机案例开发分析教程,Android手机开发应用案例分析之手机 版开心网功能实现,Android硬件驱动开发关键技术和HAL移植要领,Android中文翻译组——Android...
Android开发指南中文版-应用程序框架,Android驱动开发入门及手机案例开发分析教程,Android手机开发应用案例分析之手机 版开心网功能实现,Android硬件驱动开发关键技术和HAL移植要领,Android中文翻译组——Android...
在android开发板添加led驱动模块,并通过NDK工程生成应用层软件测试。
android 环境下利用ndk开发应用程序的例子,就可以在java下用c的库
4.3.5 执行应用程序 4.3.6 剖析生成的代码 4.4 封装C语言代码 4.4.1 全局变量 4.4.2 常量 4.4.3 只读变量 4.4.4 枚举 4.4.5 结构体 4.4.6 指针 4.5 封装C++代码 4.5.1 指针、引用和值 4.5.2 默认参数 4.5.3 重载函数...
7.2.1 修改示例应用程序使之能够使用Java线程 165 7.2.2 执行Java Threads示例 166 7.2.3 原生代码使用Java线程的优缺点 167 7.3 POSIX线程 168 7.3.1 在原生代码中使用POSIX线程 168 7.3.2 用pthread_create...
在本教程中,您将在Java中创建一个图像处理应用程序,并通过NDK使用C代码执行基本的图像处理操作。首先,了解Android原生开发工具包(NDK)的动机之一是得以利用开源项目,大多数项目都是用C语言编写的。完成本教程...