第一个JNI例子

来源:互联网 发布:手机淘宝如何打造爆款 编辑:程序博客网 时间:2024/06/01 07:58
在Eclipse开发C/C++环境配置中我们介绍了Eclipse开发C/C++的环境配置。在Android的开发中,有时我们需要使用JNI的形式来开发。谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK。而在NDKr7开始,Google的Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就可以直接利用这个脚本编译,而不需要使用Cygwin了。只需要将NDT工具配置在external tools configurations就可以了。


一、开发工具的配置
下载ndk,建议下载r8及以上版本,方便使用。在External Tools Configuration中配置javah和ndk-build两个工具。
(1)、配置javah工具,用于将我们的native方法生成对应的.h头文件。




(2)、配置ndk工具,用于将我们实现的.c和.h文件进行编译,生成.so包的形式。




二、简单JNI开发流程。
1、创建一个Android Application工程,在src目录下创建JNITest.java的类。
public class JNITest {public native boolean init();public native int add(int x,int y);public native void destroy();}
2、我们点击创建的External工具javah。系统进行编译生成jni文件夹,里面包含创建的.h头文件。
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_dsw_jnitst_JNITest */#ifndef _Included_com_dsw_jnitst_JNITest#define _Included_com_dsw_jnitst_JNITest#ifdef __cplusplusextern "C" {#endif/* * Class:     com_dsw_jnitst_JNITest * Method:    init * Signature: ()Z */JNIEXPORT jboolean JNICALL Java_com_dsw_jnitst_JNITest_init  (JNIEnv *, jobject);/* * Class:     com_dsw_jnitst_JNITest * Method:    add * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_dsw_jnitst_JNITest_add  (JNIEnv *, jobject, jint, jint);/* * Class:     com_dsw_jnitst_JNITest * Method:    destroy * Signature: ()V */JNIEXPORT void JNICALL Java_com_dsw_jnitst_JNITest_destroy  (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif

可以看到自动生成对应的函数:Java_com_lucyfyr_HelloWorld_printJNI

    Java_ + 包名(com.lucyfyr) 类名(HelloWorld) + 接口名(printJNI):必须要按此JNI规范来操作;


3、实现我们的头文件中定义的函数,创建com_dsw_jnitst_JNITest.c文件,我们挑一个函数进行实现。
#include <jni.h>#include "com_dsw_jnitst_JNITest.h"JNIEXPORT jint JNICALL Java_com_dsw_jnitst_JNITest_add  (JNIEnv *env, jobject obj, jint a, jint b){return a + b;}


4、然后在jni文件夹下创建Android.mk文件。
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := JNITstLOCAL_SRC_FILES := com_dsw_jnitst_JNITest.cinclude $(BUILD_SHARED_LIBRARY)

5、最后,我们通过创建的ndk工具进行编译,生成.so文件。

在MainActivity中进行使用:
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv = (TextView) findViewById(R.id.add);tv.setText("5 + 4=" + addNumber(5,4));}static{System.loadLibrary("JNITst");}private int addNumber(int a,int b ){JNITest jniTest = new JNITest();return jniTest.add(a, b);}}
这样就完成了基本使用。这里主要简单记录下过程,深入的知识还需学习,我们知道jni文件夹毕竟属于Android工程,怎么能编译C代码呢?这里就需要使用我们的CDT搭建的环境,创建一个C的share library工程,将头文件拷贝到C工程,然后进行开发编译测试。
0 0
原创粉丝点击