在 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/

更多相关文章

  1. [转]android单元测试初探——Instrumentation
  2. 关于安装Android(安卓)Studio的一些问题的解决方法
  3. Android(安卓)SQLite
  4. Android滑动手势侦测方法介绍
  5. android 按钮点击的两种方法以及长按事件
  6. 详解 Android(安卓)的 Activity 组件
  7. android ndk 开发之 在 应用程序中使用 jni
  8. Android(安卓)中自定义View(一)
  9. LibGDX制作android动态壁纸

随机推荐

  1. Android TextView中插入图片
  2. 【转】 关于Android堆内存的设置
  3. Android 判断 app 是否安装的方法 (nativ
  4. Android中OptionMenu的使用
  5. 可以下载Android 源代码的repo源文件
  6. Android初级教程XUtils实现“断点续传”
  7. Android学习——在线查看android源代码的
  8. android 以httpclient方式把数据提交到服
  9. Android 中常见bug 总结
  10. Android 关于下接框(spinner)的使用