1、创建android工程

2、编写JAVA类,其中包含nativie方法

例如:

public class JNI { public native void write(); public native void myOpen(String pathname); }

3、生成JNI头文件

使用javah命令

使用cmd进入android项目的bin目录中,然后执行 javah -classpath . -jni com.android.myjni.JNI这个命令

用法:javah [选项] <类>

其中 [选项] 包括:

-help 输出此帮助消息并退出

-classpath <路径> 用于装入类的路径

-bootclasspath <路径> 用于装入引导类的路径

-d <目录> 输出目录

-o <文件> 输出文件(只能使用 -d 或 -o 中的一个)

-jni 生成 JNI样式的头文件(默认)

-version 输出版本信息

-verbose 启用详细输出

-force 始终写入输出文件

com.android.myjni.JNI指包com.android.myjni下的JNI类,是要生成该类的JNI头文件

例如:com_android_myjni_JNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_android_myjni_JNI */ #ifndef _Included_com_android_myjni_JNI #define _Included_com_android_myjni_JNI #ifdef __cplusplus extern "C" { #endif /* * Class: com_android_myjni_JNI * Method: write * Signature: ()V */ JNIEXPORT void JNICALL Java_com_android_myjni_JNI_write (JNIEnv *, jobject); /* * Class: com_android_myjni_JNI * Method: myOpen * Signature: (Ljava/lang/String;)I */ JNIEXPORT void JNICALL Java_com_android_myjni_JNI_myOpen (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif

4、编写c代码

例如:com_android_myjni_JNI.c

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include "com_android_myjni_JNI.h" JNIEXPORT void JNICALL Java_com_android_myjni_JNI_write (JNIEnv *e, jobject j) { FILE* f = fopen("/sdcard/11.txt","w+"); fprintf(f, "aaaaaaaaaaaaa"); fclose(f); } JNIEXPORT void JNICALL Java_com_android_myjni_JNI_myOpen (JNIEnv *e, jobject j, jstring pathname) { //从jstring类型取得c语言环境下的char*类型 const char* name = (*e)->GetStringUTFChars(e, pathname, 0); int fd; ssize_t size; char s[] = "Linux open!/n"; char buffer[80]; fd = open(name, O_RDWR|O_CREAT|O_APPEND); if(-1 == fd) { printf("open %s error!/n", name); } else { printf("open %s success!/n", name); size = write(fd, s, sizeof(s)); printf("wirte %d bytes!/n", size); memset(buffer, '/0', sizeof(buffer)); size = read(fd, buffer, sizeof(buffer)); printf("read %d bytes!/n", size); close(fd); printf("%s/n", buffer); } //释放jni分配的内存 (*e)->ReleaseStringUTFChars(e, pathname, name); } 5、编写Android.mk 例如: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := myjni LOCAL_SRC_FILES := com_android_myjni_JNI.c include $(BUILD_SHARED_LIBRARY) 6、 编译so文件

进行编译so文件:
进入工程目录,执行 ndk-build,例如:~/workspace/MYJni$ ndk-build

则会在libs/armeabi/生成相应的so文件,例如:libmyjni.so

工程目录结构:

src下包含java文件

自己新建一个jni文件,包含com_android_myjni_JNI.h、com_android_myjni_JNI.c、Android.mk文件

so文件会自动在libs/armeabi/下生成

测试代码:

package com.android.myjni; import android.app.Activity; import android.os.Bundle; public class JniTest extends Activity { static { System.loadLibrary("myjni"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); JNI j = new JNI(); j.write(); j.myOpen("/sdcard/12.txt"); } }


更多相关文章

  1. android手机内存中的文件操作
  2. Android(安卓)之 Bitmap 和 File 相互转换
  3. Android共享数据ContentProvider的使用
  4. android 学习之安装
  5. Android引入签名文件
  6. Android(安卓)NDK开发:HelloNDK
  7. UI 开源代码 FileBrowserView
  8. Qt5.1.1 for android 环境配置
  9. Android模仿文件夹管理实例

随机推荐

  1. Android的View的VISIBLE,INVISIBLE,GONE
  2. Android(安卓)可拖拽悬浮按钮
  3. 使用showmap分析android进程内存占用情况
  4. 详解Android中的屏幕方向类型
  5. 纯css3无js实现的Android(安卓)Logo(有简
  6. 百度地图应用开发(一)
  7. 在Titanium中使用Android的Service
  8. 下载安装eclipse ADT插件:
  9. ClassNotFoundException解决方案总结
  10. Android设置透明状态栏,仿ios状态栏