一、 Android NDK r5安装
1、 cygwin的安装和简单配置
①首先到http://www.cygwin.com下载setup.exe ,接着建立安装目录,如X:/cygwin(我用的是E:/cygwin ) ,将setup.exe放到此目录。
②启动安装:
BEGIN-> 点击setup.exe:
③Next->选Install from Internet(选择在线安装方式):
③Next->选Install from Internet(选择在线安装方式):
④Next->填写Root Directory,如X:/cygwin(选择安装路径):
⑤Next->填写Local Package Directory,如X:/cygwin/ftp(选择下载文件存放的目录):
⑥Next->选Direct Connection(选择网络连接方式):
⑦Next->选一个较快的ftp(选择下载镜像站点):
⑧Next->(开始下载安装):
⑨到了关键步骤,点击All旁边的旋转状图标,将Default切换至Install,全部安装;
⑩选择创建快捷方式。->END
最后启动Cygwin,测试安装是否成功:
点击快捷方式打开控制台,如果是域用户,按照提示makepasswd和makegroup即可。
输入gcc –v 以及make-v,出现版本信息表示安装成功
输入命令检查
出现以上版本信息则表明make和gcc 已经安装成功。
2、 Android NDK r4 Windows
①首先到官网下载Android NDK r4 Windows
②android-ndk-r4直接解压就行了,我将其放在了D:\cygwin\program\android-ndk-r4
③在cygwin安装目录下打开文件home/<你的用户名>/.bash_profile文件中最后添加环境变量:
NDK=/cygdrive/<ndk所在路径>
export NDK
我的是:
NDK=/cygdrive/D/cygwin/program/android-ndk-r4
export NDK
其中"NDK"这个名字随便起,因为后面要用经常使用,建议不要太长。
重启cygwin,输入cd$NDK进入对应目录,就成功了。
注意:添加时用UltraEdit打开添加,如果是中文OS 使用记事本或者写字板打开编辑后,重新启动Cygwin 会报错。可以按照下图方式转换:
二、JNI实例
1、安装成功后编译NDK中的一个例子命令行:
编译完成后在E:/Android_NDK/android-ndk-r5/samples/hello-gl2文件夹中会生成一个文件夹libs,里面有一个子文件夹armeabi,里面生成libgl2jni.so文件。
2、一个简单的JNI例子
下面用一个简单的例子介绍怎么生成一个.so文件以及在Android项目中怎么调用.so文件。
① 首先,用Eclipse建立一个ANDROID的工程,命名为JNITest,建议一个jni调用的类封装native method
package jni.sam.you;
public class MyJNI
{
public native int numPlus(int a,int b);
static{
System.loadLibrary("hellojni"); }
}
打开windows命令行窗口,cd命令到eclipse工程目录下bin目录,我的是E:\androidworkspace\JNITest\bin
键入javah -jni jni.sam.you.MyJNI 来编译eclipse生成的.class文件
可以生成jni_sam_you_MyJNI.h这个文件的主要作用就是生成函数名,把这个函数名拷出来这个文件就可以删了。
jni_sam_you_MyJNI.h
/* DO NOT EDIT THIS FILE - it is machinegenerated */
#include <jni.h>
/* Header for class jni_sam_you_MyJNI */
#ifndef _Included_jni_sam_you_MyJNI
#define _Included_jni_sam_you_MyJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
*Class: jni_sam_you_MyJNI
*Method: numPlus
*Signature: (II)I
*/
JNIEXPORT jint JNICALLJava_jni_sam_you_MyJNI_numPlus
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
然后将这个函数名拷贝出来实现他的函数体
jni_sam_you_MyJNI.c
/* DO NOT EDIT THIS FILE - it is machinegenerated */
#include <jni.h>
/*
*Class: jni_sam_you_MyJNI
*Method: numPlus
*Signature: (II)I
*/
JNIEXPORT jint JNICALLJava_jni_sam_you_MyJNI_numPlus
(JNIEnv *env, jobject jj, jint a, jint b)
{
returna+b;
}
注意:参数名一定要补全,不然编译不通过
然后写在android工程jni目录下写Android.mk文件,同时把.c源文件拷贝到jni文件夹下
# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the"License");
# you may not use this file except in compliance with theLicense.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to inwriting, software
# distributed under the License is distributed on an"AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, eitherexpress or implied.
# See the License for the specific language governingpermissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=hellojni
LOCAL_SRC_FILES := jni_sam_you_MyJNI.c
include $(BUILD_SHARED_LIBRARY)
之后在cygwin下到eclipse工程目录的jni文件夹下,(注: cd .. 可以返回上级目录,cd e:可以到e盘),输入命令:$NDK/ndk-build
出现上面内容说明编译成功,返回eclipse右击工程名字选择刷新,得到的结构目录如下:
在主activity里调用native method
package jni.sam.you;
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
static
{
System.loadLibrary("hellojni");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("###########");
System.out.println(newMyJNI().numPlus(2, 3));
}
}
从logcat里即可看到对应结果