在 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 使用Handler的PostDelayed方法实现图片的轮播
  2. Android 应用启动闪白一下处理方法
  3. android 调用js中的方法
  4. Android ScrollView 内部控件 layout_margin失效的解决方法
  5. Android:Debug certificate expired on DATE 解决方法

随机推荐

  1. android移动数据上网的开关的实现
  2. 腾讯微博客户端开发视频--若水(第三集、第
  3. Android SDK 快速安装方法
  4. android获取APK签名信息及MD5指纹
  5. 【面包屑】快速使用RecyclerView搭建列表
  6. 修改ListView的分割线
  7. Android之Handler详解(四)
  8. Android LayoutInflater
  9. eclipse导入的Android项目没有android.ja
  10. Android面试系列文章2018之Android部分Ha