一、综述
有很多介绍搭建Android NDK开发环境的文章,但是,大部分都是过时的,总结一下,大致有两种:
(1)eclipse的NDK Builder配置;
(2)eclipse的NDK环境配置。
一般,NDK是r7之前的版本,必须要安装Cygwin。本文使用r10版本。下面分别介绍这两种开发方式的搭建。先安装好ndk,安装过程这里就不说了。
二、NDK环境配置
(1)打开Eclipse,点Window->Preferences->Android->NDK,设置NDK路径。
(2)在工程上右键点击Android Tools->Add Native Support...,然后给我们的.so文件取个名字。
这时候工程就会多一个jni的文件夹,jni下有Android.mk和my-ndk.cpp文件。Android.mk是NDK工程的Makefile,HelloJNI.cpp就是NDK的源文件。
(3)编辑HelloJNI.cpp源文件,相关代码如下:
#include <string.h> #include <jni.h> #include <stdio.h> jstring JNICALL hello_jni(JNIEnv *env, jobject thiz) { return env->NewStringUTF("Hello jni"); }
(4)编译生成so库,点击小锤子就可以编译jni代码,生产so库了。
三、NDK Builder配置
首先,在工程目录下建立jni目录,并建立HelloJNI.cpp文件和Android.mk文件。可以将上面的对应的文件拷贝过来。然后,新建、并配置一个Builder,如下:
(a)Project->Properties->Builders->New,新建一个Builder。
(b)在弹出的【Choose configuration type】对话框,选择【Program】,点击【OK】:
(c)在弹出的【Edit Configuration】对话框中,配置选项卡【Main】。
在“Name“中输入新builders的名称(这个名字可以任意取)。
在“Location”中输入nkd-build.cmd的路径(这个是下载完ndk8后解压后的路径,这个建议放在根目录下面,路径不能有空格和中文)。根据各自的ndk路径设置,也可以点击“Browser File System…”来选取这个路径。
在“Working Diretcoty”中输入本工程的位置(也可以点击“Browse Workspace”来选取目录)。
(d)继续在这个【Edit Configuration】对话框中,配置选项卡【Refresh】。
勾选“Refresh resources upon completion”,
勾选“The entire workspace”,
勾选“Recuresively include sub-folders”。
(e)继续在【Edit Configuration】对话框中,配置选项卡【Build options】。
勾选“After a “Clean””,(勾选这个操作后,如果你想编译ndk的时候,只需要clean一下项目 就开始交叉编译)
勾选“During manual builds”,
勾选“During auto builds”,
勾选“Specify working set of relevant resources”。
点击“Specify Resources…”勾选TestNdk工程中新建的“jni“目录,点击”finish“。 点击“OK“,完成配置。
到此,编译环境以及成功搭建完毕!可以看到,已经自动生成了hellojin.so文件。
四、编写java测试代码。
(1)编写java代码。
package com.example.hellojni; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class MainActivity extends Activity { static { System.loadLibrary("HelloJNI"); } public native String hello(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tvText = (TextView) findViewById(R.id.hello); tvText.setText( hello()); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
(2)测试。下载到虚拟机中就可以看到helloJNI了。