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/

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值