tiny210 ndk jni接口

win7:
首先下载jdk, 
     http://www.oracle.com/technetwork/java/javase/downloads/index.html
还有eclipse+adt,可以一揽子下载,http://developer.android.com/sdk/index.html

对于想使用c/c++开发android的应用程序,需要安装NDK环境,即本地开发环境
参考
http://www.metsky.com/archives/525.html

一、下载android NDK

您可以下载NDK r4  for Windows或NDK r5  for Windows安装包,下载地址:

地址:http://developer.android.com/sdk/ndk/index.html


二、下载Cygwin

由于NDK开发大都涉及到C/C++在GCC环境下编译、运行,所以在Windows环境下,需要模拟Linux模拟编译环境,下载地址:

http://www.cygwin.com/




注意的一点是,在安装cygwin时
tiny210 ndk jni接口_第1张图片


Cygwin会把所有的硬盘分区映射到/cygdrive/目录下




android下java通过c代码提供的jni接口控制led
步骤
1.一般是自定义一个java jni类,jni类主要用于加载so和向其他java类提供so的接口。其有个static块,系统自动调用而加载so。其他类如activity类去调用这个jni类的函数。
HardwareControlClass.java

package com.example;
import android.util.Log;
public class HardwareControlClass {
	 static public native String stringFromJNI();
	 static public native int Open();
	 static public native int IOCTLLED(int ledID, int ledState ,int fd);
	 static {
	     try {
	      System.loadLibrary("hello-jni");
	     } catch (UnsatisfiedLinkError e) {
	         Log.d("HardwareControler", "HardwareControler ibrary not found!");
	     }
	 } 
}

而java应用调用java jni时,只需要如下即可:
fd=HardwareControlClass.Open();
 HardwareControlClass.IOCTLLED(0, 1, fd);


2.实现c++的jni类:
需要在android项目根目录下建立jni目录,jni目录下建立Android.mk和led-jni.c。
led-jni.c中的函数的命名需要遵守规范,要和要java的jni类(即调用c函数的类)的包名对应,否则出错。
比如上面的java的jni类HardwareControlClass的路径是com.example.HardwareControlClass,
则c的jni函数名前缀就是Java_com_example_HardwareControlClass_
hello-jni.c

#include <string.h>
#include <jni.h>
#include <fcntl.h>
#define DEV_NAME "/dev/leds"

jstring
Java_com_example_HardwareControlClass_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}

jint
Java_com_example_HardwareControlClass_Open(JNIEnv *env,
          jobject thiz)
{
 int fd=open(DEV_NAME,O_RDWR);
 return fd;
}



jint
Java_com_example_HardwareControlClass_IOCTLLED(JNIEnv *env,
          jobject thiz,
          jint ledid,
          jint controlcode,
          jint fd)
{
 int CTLCODE = controlcode;
 ioctl(fd,controlcode,ledid);
 return 0;
}


编译时,使用终端进入android项目 根目录下执行ndk-build,生成在项目目录的libs目录下的某个目录生成so。然后编译整个apk,会把so包含在内。直接在板子上运行apk即可。
 export NDK=/cygdrive/d/android/android-ndk-r8b-windows/android-ndk-r8b/
 $NDK/ndk-build
Cygwin         : Generating dependency file converter script
Compile thumb  : led-jni <= led-jni.c
SharedLibrary  : libled-jni.so
Install        : libled-jni.so => libs/armeabi/libled-jni.so
tiny210 ndk jni接口_第2张图片
led-2013年7月19日.rar
参考
 

Android驱动使用JNI调用



其他测试:
 使用eclipse打开ndk源码中附带的hello-jni例子,我的位于
D:\android\android-ndk-r8b-windows\android-ndk-r8b\samples\hello-jni
tiny210 ndk jni接口_第3张图片

songa@songa-PC ~
$ cd $NDK

songa@songa-PC /cygdrive/d/android/android-ndk-r8b-windows/android-ndk-r8b
$ cd samples/hello-jni

songa@songa-PC /cygdrive/d/android/android-ndk-r8b-windows/android-ndk-r8b/samples/hello-jni
$ $NDK/ndk-build    //在工程目录下编译,ndk-build会寻找jni目录,将其目录下的文件编译
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Install        : helloworld => libs/armeabi/helloworld //会在工程目录中生成libs目录

 
 直接测试c代码,jni目录下的文件如下 
 
//Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=hello.c
LOCAL_MODULE := helloworld
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
//hello.c
#include <stdio.h>

int main()
{
	printf("hello song\n");
}


测试jni接口,jni目录下的文件如下
//Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)
//hello-jni.c
#include <string.h>
#include <jni.h>

/* This is a trivial JNI example where we use a native method
 * to return a new VM String. See the corresponding Java source
 * file located at:
 *
 *   apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
 */
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}

使用ndk-build编译时,使用的是ndk源码带的编译器:
$ ls toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/arm-linux-androideabi/bin/
ar.exe  as.exe  c++.exe  g++.exe  gcc.exe  ld.exe  nm.exe  objcopy.exe  objdump.exe  ranlib.exe  strip.exe


你可能感兴趣的:(tiny210 ndk jni接口)