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
注意的一点是,在安装cygwin时

Cygwin会把所有的硬盘分区映射到/cygdrive/目录下
android下java通过c代码提供的jni接口控制led
步骤
1.一般是自定义一个java jni类,jni类主要用于加载so和向其他java类提供so的接口。其有个static块,系统自动调用而加载so。其他类如activity类去调用这个jni类的函数。
HardwareControlClass.java
而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
编译时,使用终端进入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
led-2013年7月19日.rar
参考
Android驱动使用JNI调用
其他测试:
使用eclipse打开ndk源码中附带的hello-jni例子,我的位于
D:\android\android-ndk-r8b-windows\android-ndk-r8b\samples\hello-jni
测试jni接口,jni目录下的文件如下
使用ndk-build编译时,使用的是ndk源码带的编译器:
首先下载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模拟编译环境,下载地址:
注意的一点是,在安装cygwin时
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
led-2013年7月19日.rar
参考
Android驱动使用JNI调用
其他测试:
使用eclipse打开ndk源码中附带的hello-jni例子,我的位于
D:\android\android-ndk-r8b-windows\android-ndk-r8b\samples\hello-jni
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