0
点赞
收藏
分享

微信扫一扫

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

 

 

 

举报

相关推荐

0 条评论