第一个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的类。
3、实现我们的头文件中定义的函数,创建com_dsw_jnitst_JNITest.c文件,我们挑一个函数进行实现。
4、然后在jni文件夹下创建Android.mk文件。
5、最后,我们通过创建的ndk工具进行编译,生成.so文件。
在MainActivity中进行使用:
一、开发工具的配置
下载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
- 第一个JNI例子
- 动手做了第一个JNI的小例子
- 第一个安卓JNI例子
- JNI学习笔记(一)第一个JNI详细例子配图文
- 第一个JNI程序
- 第一个JNI程序
- JNI第一个程序
- 第一个JNI程序
- 第一个jni工程
- 第一个JNI开发
- 第一个Authorware例子
- 第一个spring例子
- 第一个jstl例子
- 第一个jboss例子
- 第一个lucene例子
- 第一个cuda例子
- 第一个dwr例子
- 第一个jquery例子
- ssh-keygen的使用方法
- 资本寒冬,看咕咚、Keep、Feel们如何逆势而上
- 初识IntPtr
- CGI和Servlet的对比
- 一起学Netty(二十)netty的比较规范的C/S端的写法
- 第一个JNI例子
- 编写类似strcmp() strncmp()函数
- Hive ORC数据格式的MapReduce读写
- 微服务应用-基于Spring Cloud和Docker构建电影推荐微服务
- Ant自动编译Java project时无法找到rt.jar的处理方法
- 显示Intent和隐式Intent的使用(意图)
- 虚拟机打包重新部署全过程详细说明
- mysql存储过程初级
- 热度TopN排名算法的设计