因为项目要在nand和sdcard上搜索某一类型的文件,用java来实现速度太慢,因此要自己来写jni的代码,于是热热手先写一个简单写了一个简单的例子
第一,java源代码的编写,在eclips下面新建android工程,创建helloJNI.java
package com.john.helloJNI;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class helloJNI extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView JNITest = (TextView)findViewById(R.id.jniTextView);
Log.i("hellojni", "before!/n");
String str = getJNItest();
Log.i("hellojni", "before!/n");
JNITest.setText(str);
}
static{
System.loadLibrary("JNITest");
}
public native String getJNItest();
}
在命令行下进入工程所在目录,运行
javah -classpath bin -d jni com.john.helloJNI.helloJNI
-d的含义是生成一个jni的目录,里面存放生成的jni的.h文件 ,com.john.helloJNI.helloJNI是类,生成com_john_helloJNI_helloJNI.h
编写com_john_helloJNI_helloJNI.c
#include "com_john_helloJNI_helloJNI.h"
JNIEXPORT jstring JNICALL Java_com_john_helloJNI_helloJNI_getJNItest(JNIEnv* env, jobject obj)
{
return (*env)->NewStringUTF(env, (char *)"JNITest Native String");
}
编写android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
com_john_helloJNI_helloJNI.c
LOCAL_C_INCLUDES:= /
$(JNI_H_INCLUDE)
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libJNITest
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)
把这二个文件com_john_helloJNI_helloJNI.c和android.mk放在前面建立的jni目录下
其实可以手动在ndk里面编译这3个文件,但是最好还是用eclipse来编译,这样有什么错误修改源代码也更方便。
在eclipse里面右击工程项目,选择最后一个properties,选择Builders->new->Program.这个时候会出现一个选项卡菜单。
Main选项卡中
location 填写 /bin/bash (因为我用的是unbuntu)
working Directory 填写 /bin
Argument填写
--login -c "cd /home/john/android/workspace/desktop/jni && /home/john/android/android-ndk-r5/ndk-build"
这里--login是登录bash,-c是命令, cd 后面是刚才创建jni目录,&&是说明还需要继续运行后面的命令,后面就是ndk的ndk-bulid文件
所在的目录了。
如图
![]()
后面的Reflesh选项卡和BuildOption选项卡如下图
![]()
![]()
其中二个的Specify Resources都要选中前面创建的jni文件夹。
现在配置完成了,退出后就可以看到eclipse自动在编译了,如果编译成功,会在工程目录下同步生成一个文件夹libs/armeabi,里面会有
生成的so文件。
简单的jni完成了,现在开始准备动手做项目了。