上一篇博客中有讲解关于JNI NDK是什么以及他们之间的关系。并且通过原始方式讲解了一个JNI项目的创建过程。那么这一篇博客我们将讲解NDK的开发环境的搭建,及如何通过NDK来开发一个JNI项目。
首先我们来看下如何在Eclipse下搭建一个NDK开发环境(现在Android studio越来越流行,其很多功能也比Eclipse强大,有时间再补上Android studio 下NDK开发,我也会提供有关Android studio配置开发讲解的博客)。
1:首先需要下载NDK,下载地址为:http://developer.android.com/tools/sdk/ndk/index.html。如果不能访问,可以联系我,本来有上传个如何访问国外网址的方法,但是CSDN貌似不允许上传。
2:下载下来后是个exe程序,我的为android-ndk-r10e-windows-x86_64.exe,双击即可解压出文件夹android-ndk-r10e。然后把这个文件夹放到你想要放的磁盘目录下。
3:打开Eclipse,新建一个Android项目,命名为NdkTestJNI。
4:在项目NdkTestJNI右键->New->Folder,输入文件名jni- 》Finish。
5:现在需要给NdkTestJNI配置NDK开发环境。
在Eclipse里Project->Properties->Builders->New->在弹出的【Choose configuration type】对话框里面双击Program->在弹出的【Edit Configuration】对话框中,
切换至Main这个tab:
1:Name输入NDK(任意取)
2:Location栏目点击Browse File System,选择你之前解压出的NDK文件夹的位置。
3:Working Directory栏目点击Browse Workspace,选中刚刚创建的android项目NdkTestJNI。
切换至Refresh:
1:选择“Refresh resources upon completion”
2:选择“The entire workspace”
3:选择“Recuresively include sub-folders”
切换至Build Options:
1:选择“After a “Clean””
2:选择“During manual builds”
3:选择“During auto builds”
4:选择“Specify working set of relevant resources”
5:点击Specify Resources,在弹出的对话框中勾选刚刚创建的android项目NdkTestJNI
最后点ok,就配置好了
6:在项目里添加类jniFunction,并添加一个和上一篇博客一样的native函数。
package com.example.ndktestjni;
public class jniFunction {
public native int add(int a, int b); //native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。java编译器遇到native函数时,不会关心该函数的具体实现。
}
7:命令行进入jniFunction.java目录,并用javac jniFunction.java生成jniFunction.class文件。具体生成方式见
上一篇博客。然后与上一篇博客讲的生成.h文件方式有点不同。在这个android项目中需要命令行退至src目录下然后 javah com.example.ndktestjni.jniFunction(javah 包名路径.class名)。不明白生成方式的见
上一篇博客
8: 把生成的.h文件com_example_ndktestjni_jniFunction.h拷贝到刚创建在项目里的jni目录下,在jni目录上右键->New->File,输入文件名com_example_ndktestjni_jniFunction.c。加入代码:
#include "com_example_ndktestjni_jniFunction.h"
#include <stdlib.h>
#include <stdio.h>
JNIEXPORT jint JNICALL Java_com_example_ndktestjni_jniFunction_add
(JNIEnv *env, jobject arg, jint a, jint b)
{
int result = (int)(a+b);
return result;
}
9:在jni目录上右键->New->File,输入文件名Android.mk 不能取别的名字 ,加入
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NdkTestJNI
LOCAL_SRC_FILES := com_example_ndktestjni_jniFunction.c
include $(BUILD_SHARED_LIBRARY)
10:最后再android项目MainActivity中加入如下代码:
package com.example.ndktestjni;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity {
static
{
System.loadLibrary("NdkTestJNI"); //引入c++库
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int a = jniFunction.add(1,2); //调用JNI函数
Toast.makeText(this, ""+a, 100).show();
}
}
11:到此这个通过NDK创建JNI项目就完成了,我们和前一篇博客对比,发现通过NDK创建JNI项目,只要把环境搭好:
1:那么直接可以在这个Android项目中编写c/c+代码,不需要去c/c++开发工具中另建项目编写
2:还有是不需要像之前那样每次编译c/c++代码,都需要重新把dll拷贝到Java目录下
3:能自动将so库和java应用一起打包成apk
好了,通过NDK创建JNI项目就讲到这里吧。