您的位置:首页 > 移动开发 > Android开发

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

2016-05-17 18:17 676 查看
本文的目标是实现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.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := TestJNI
LOCAL_SRC_FILES := string_pub_jni_test_TestJni.cpp
LOCAL_SRC_FILES += CAdd.cpp

include $(BUILD_SHARED_LIBRARY)


//Application.mk
APP_PROJECT_PATH := ${call my-dir}
APP_BUILD_SCRIPT=$(APP_PROJECT_PATH)/Android.mk
APP_MODULES := TestJNI

APP_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_ADD
class 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开发实例。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: