[Android]NDK开发环境配置与JNI开发

来源:互联网 发布:淘宝网小开衫 编辑:程序博客网 时间:2024/06/05 12:02

本文的目标是实现NDK开发环境的配置以及学习JNI开发流程。

1.环境配置

本文的开发环境为win10 64位+Eclipse+Android ADT+NDK+CDT。

2.安装:

这里只介绍NDK和CDT的安装。

2.1从链接:http://dl.google.com/android/repository/android-ndk-r11c-windows-x86_64.zip下载NDK开发包,然后解压到本地路径,并拷贝本路径(比如我的是:D:\android-sdk\android-ndk-r11c-windows-x86_64\android-ndk-r11c)。

2.2配置系统的环境变量,操作路径为:高级系统设置–>环境变量–>找到PATH–>新建即可,如下图所示:
这里写图片描述

2.3为Eclipse添加NDK路径,操作路径为:Windows–>Preference–>NDK,如下图所示:
这里写图片描述

2.4为Eclipse安装CDT插件添加c/c++环境支持,安装连接:cdt - http://download.eclipse.org/tools/cdt/releases/8.8.1。操作路径为:help–>Install New Software,如下图所示:
这里写图片描述

3.完成了第二步,接下来进行代码编写

3.1新建一个安卓项目,并在项目的根目录下新建jni文件夹,如下图所示:
这里写图片描述

3.2在string.pub.jni.test包下新建TestJni.java类,添加如下代码:

package string.pub.jni.test;public class TestJni {        public native boolean init();        public native int add(int x , int y);        public native void destory();        }

3.3将上一步创建的类文件拷贝到bin目录下,然后从命令行界面cd到..\AJniDemo\bin目录下运行javac TestJni.java,完成后可以看到在bin目录下生成的TestJni.class文件了。之后在..\bin目录下按照包名的顺序新建文件夹,路径为..\bin\string\pub\jni\test,将TestJni.class拷贝到..\bin\string\pub\jni\test目录下,在命令行界面执行javah -jni string.pub.jni.test.TestJni可以看到在..\bin目录下生成了string_pub_jni_test_TestJni.h这个头文件。将生成的头文件拷贝到项目的jni目录下,如下图所示:
这里写图片描述

3.4上一步生成了所需要的头文件,这一步开始实现c++层的代码了。按照上一步新建图中的文件,然后右键项目–>Android Tools–>Add Native Support。所需要的代码如下:

//Android.mkLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := TestJNILOCAL_SRC_FILES := string_pub_jni_test_TestJni.cppLOCAL_SRC_FILES += CAdd.cppinclude $(BUILD_SHARED_LIBRARY)
//Application.mkAPP_PROJECT_PATH := ${call my-dir}APP_BUILD_SCRIPT=$(APP_PROJECT_PATH)/Android.mkAPP_MODULES := TestJNIAPP_ABI := armeabi armeabi-v7a x86
//CAdd.cpp#include "CAdd.h"CAdd::CAdd(){}CAdd::~CAdd(){}int CAdd::add(int x, int y){return x+y;}
//CAdd.h#ifndef JNI_TEST_ADD#define JNI_TEST_ADDclass CAdd{public:CAdd();~CAdd();int add(int x, int y);};#endif
//string_pub_jni_test_TestJni.cpp#include <stdlib.h>#include <stdio.h>#include "CAdd.h"#include "jni.h"CAdd *pCAdd = NULL;extern "C" {JNIEXPORT jboolean JNICALL Java_string_pub_jni_test_TestJni_init  (JNIEnv *env, jobject obj){if(pCAdd==NULL){pCAdd = new CAdd ;}return pCAdd!=NULL;}JNIEXPORT jint JNICALL Java_string_pub_jni_test_TestJni_add  (JNIEnv *env, jobject obj, jint x, jint y){jint res = -1;if(pCAdd==NULL){    pCAdd = new CAdd ;res = pCAdd->add(x,y);}else{    res = pCAdd->add(x,y);}return res;}JNIEXPORT void JNICALL Java_string_pub_jni_test_TestJni_destory  (JNIEnv * env, jobject obj){if(pCAdd!=NULL){delete pCAdd;pCAdd=NULL;}}}

3.5命令行界面下,在项目根目录下执行:ndk-build,成功之后刷新项目,就可以看到在Libs下面生成了.so文件。如下图所示:
这里写图片描述

4.调用JNI方法:

4.1将3中生成的.so文件拷贝到别的项目的libs文件夹下,然后新建下图所示的包和类:
这里写图片描述
4.2在TestJni.java中添加如下代码:

package string.pub.jni.test;public class TestJni {        public native boolean init();        public native int add(int x , int y);        public native void destory();        }

4.3在其他地方调用JNI方法,如下所示:

import string.pub.jni.test.TestJni;public class MainActivity extends Activity {    static{        System.loadLibrary("TestJNI");    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TestJni test=new TestJni();        int ii=test.add(22, 2);        Toast.makeText(getApplicationContext(), ""+ii, Toast.LENGTH_SHORT).show();    }

以上,就是一个简单的JNI开发实例。

1 0
原创粉丝点击