`
jiagou
  • 浏览: 2531709 次
文章分类
社区版块
存档分类
最新评论

android ndk 开发之 在 应用程序中使用 jni

 
阅读更多

在 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应用程序使用JNI调用驱动程序

    基于老罗的《Android内核源代码情景分析》第二章freg实例,使用NDK编译jni层从而调用驱动程序,能大大缩短项目开发周期。

    android ndk开发步骤和实例

    分步骤描述了android jni如实开发。

    细说Android4.0NDK编程.pdf

    详细剖析了NDK开发中涉及的各类问题和解决方案:搭建Android NDK开发环境的每一步细节,开发第一个Android NDK程序,Android NDK中Java与C/C++代码的互相调用,Facade设计模式在NDK中的美妙应用,NDK与软/硬件整合,...

    Android C++高级编程: 使用NDK

    《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去实现自己的Android应用中对性能要求较高的部分。  《移动开发经典丛书·Android C++高级编程:使用NDK》介绍了...

    《Android应用开发揭秘》附带光盘代码.

     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应用开发揭秘》源码

     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

    《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去实现自己的Android应用中对性能要求较高的部分。  《移动开发经典丛书·Android C++高级编程:使用NDK》介绍了...

    Android NDK 开发教程

    众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。 NDK包括了: 从C / C++生成原生代码库所需要的工具和build files。 将一致的原生库嵌入可以在Android...

    Android应用开发揭秘pdf高清版

    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脚本环境 ...

    pro-android-c-w-ndk-master.tar

    《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去实现自己的Android应用中对性能要求较高的部分。  《移动开发经典丛书·Android C++高级编程:使用NDK》介绍了...

    Android NDK开发详细介绍

    Android之NDK开发  一、NDK产生的背景  Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第...

    Android 初学中阶高阶书籍_集合打包3

    Android开发指南中文版-应用程序框架,Android驱动开发入门及手机案例开发分析教程,Android手机开发应用案例分析之手机 版开心网功能实现,Android硬件驱动开发关键技术和HAL移植要领,Android中文翻译组——Android...

    Android 初学中阶高阶书籍_集合打包2

    Android开发指南中文版-应用程序框架,Android驱动开发入门及手机案例开发分析教程,Android手机开发应用案例分析之手机 版开心网功能实现,Android硬件驱动开发关键技术和HAL移植要领,Android中文翻译组——Android...

    ok6410 Android开发板ndk开发生成测试led驱动模块

    在android开发板添加led驱动模块,并通过NDK工程生成应用层软件测试。

    hello-jni.rar_ android jni_android hello jni_android jni hellojn

    android 环境下利用ndk开发应用程序的例子,就可以在java下用c的库

    pro_android_cpp_with_the_ndk.pdf

    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 重载函数...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    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...

    使用AndroidNDK重用现有的C代码

    在本教程中,您将在Java中创建一个图像处理应用程序,并通过NDK使用C代码执行基本的图像处理操作。首先,了解Android原生开发工具包(NDK)的动机之一是得以利用开源项目,大多数项目都是用C语言编写的。完成本教程...

Global site tag (gtag.js) - Google Analytics