要使用jni首先要配置NDK以及CDT,配置好之后,下面来简要说明一下使用jni的一些步骤:

(一)创建jni相应的C++文件
1>生成jni相应的头文件
我是这样做的,当我需要在java中调用一些函数的时候,我会把这写函数
单独写在一个.java文件中(当然如果你熟悉jni的一些数据类型的转换以及命名规则后就可以自己写,跳过第(一)步了),
比如如下所示:
这个例子中的源文件为: UsageJniActivity.java
  1. public class UsageJniActivity { 
  2.     public native float resultofmultiply(int n1, int n2); 
  3.     public native float calculateGapOfTwoPoint(int nx1, int ny1, int nx2, 
  4.             int ny2);  
  5.     public native void setString(String strText); 

在终端上先cd到该文件所在的目录
1)编译这个源文件
javac UsageJniActivity.java
生成UsageJniActivity.class
2)生成相应的头文件
javah UsageJniActivity
生成的UsageJniActivity.h文件内容如下:
  1. /* DO NOT EDIT THIS FILE - it is machine generated */ 
  2. #include <jni.h> 
  3. /* Header for class UsageJniActivity */ 
  4.   
  5. #ifndef _Included_UsageJniActivity 
  6. #define _Included_UsageJniActivity 
  7. #ifdef __cplusplus 
  8. extern "C" { 
  9. #endif 
  10. /* 
  11.  * Class:     UsageJniActivity 
  12.  * Method:    resultofmultiply 
  13.  * Signature: (II)F 
  14.  */ 
  15. JNIEXPORT jfloat JNICALL Java_UsageJniActivity_resultofmultiply 
  16.   (JNIEnv *, jobject, jint, jint); 
  17.   
  18. /* 
  19.  * Class:     UsageJniActivity 
  20.  * Method:    calculateGapOfTwoPoint 
  21.  * Signature: (IIII)F 
  22.  */ 
  23. JNIEXPORT jfloat JNICALL Java_UsageJniActivity_calculateGapOfTwoPoint 
  24.   (JNIEnv *, jobject, jint, jint, jint, jint); 
  25.   
  26. /* 
  27.  * Class:     UsageJniActivity 
  28.  * Method:    setString 
  29.  * Signature: (Ljava/lang/String;)V 
  30.  */ 
  31. JNIEXPORT jstring JNICALL  Java_UsageJniActivity_getString 
  32.     (JNIEnv *, jobject); 
  33.   
  34. #ifdef __cplusplus 
  35. #endif 
  36. #endif 
 
将头文件重命名为Calculate.h
2>创建Calculate.cpp文件并实现相关的函数,如下:
  1. #include "Calculate.h" 
  2.   
  3. JNIEXPORT jfloat JNICALL Java_UsageJniActivity_resultofmultiply( 
  4.         JNIEnv * env, jobject thiz, jint a, jint b) { 
  5.     return a * b; 
  6.   
  7. JNIEXPORT jfloat JNICALL JNICALL Java_UsageJniActivity_calculateGapOfTwoPoint( 
  8.         JNIEnv * env, jobject thiz, jint nx1, jint ny1, jint nx2, jint ny2) { 
  9.   
  10.     float fvalue = (nx1 - nx2) * (nx1 - nx2) + (ny1 - ny2) * (ny1 - ny2); 
  11.     return fvalue; 
  12.   
  13. JNIEXPORT jstring JNICALL Java_UsageJniActivity_getString( 
  14.         JNIEnv * env, jobject thiz) { 
  15.     char str[] = { "hello everyone" }; 
  16.     return env->NewStringUTF(str); 

这样关于jni的c++部分代码已经写完了。
(ps:这里需要说明一下,函数的名称不是随意的,在这里为Java_UsageJniActivity_resultofmultiply,
其中Java_是都一样的,UsageJniActivity_为包以及类名,下面如果要使用的话还需将函数的名字进行修改,
使之与包名及类名相一致,否则会报错)。
(二)android中使用jni
1>首先创建一个android工程,假设为UsageJni, 包的结构为com.usejni,在工程的目录下创建一个文件夹,名字
为jni,将Calculate.h以及Calculate.cpp文件拷贝进去,将函数名进行相应的修改(前面说过),将Java_UsageJniActivity_ 改为Java_com_usejni_UsageJniActivity_同时还要创建两个文件Android.mk以及Application.mk,内容分别如下:
Android.mk:
  1. # Copyright (C) 2009 The Android Open Source Project 
  2. # Licensed under the Apache License, Version 2.0 (the "License"); 
  3. # you may not use this file except in compliance with the License. 
  4. # You may obtain a copy of the License at 
  5. #      http://www.apache.org/licenses/LICENSE-2.0 
  6. # Unless required by applicable law or agreed to in writing, software 
  7. # distributed under the License is distributed on an "AS IS" BASIS, 
  8. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  9. # See the License for the specific language governing permissions and 
  10. # limitations under the License. 
  11. LOCAL_PATH := $(call my-dir) 
  12.   
  13. include $(CLEAR_VARS) 
  14.   
  15. LOCAL_MODULE    := Calculate 
  16. LOCAL_SRC_FILES := Calculate.cpp 
  17. LOCAL_LDLIBS := -llog 
  18.   
  19. include $(BUILD_SHARED_LIBRARY) 
 
Application.mk:
  1. APP_ABI := armeabi x86 
  2. APP_STL := stlport_static 
 
2>代码算是写完了,接下来就是一些琐碎的配置过程。
(1)为了能在eclipse中对jni文件进行编译调试,要将工程转化一下,具体步骤如下:
File->New->Other->C/C++->Convert to a c/c++ project
在project type:中选择Makefile project
在Toolchains:中选择--Other Toolchain然后点击Finish。
(2)添加NDK编译命令,在工程上点击右键,选择属性,弹出属性对话框,
选择C/C++ Build在Build Settings中去掉use default build command
在build command中输入 ndk-build点击ok结束。
(3)现在已经可以对整个工程进行编译,运行了。
(4)完成第三步后想必大家也会发现一个问题,就是工程虽然可以编译运行,但当我们在工程中
打开jni文件夹中的文件时,却发现会出现文件引用不到的错误,这是由于我们没有将NDK
的文件引用来的缘故,具体解决办法如下:
Windows->Prefrences->C/C++->Build->Environment
在右侧添加一个变量:
C_INCLUDE_PATH:
  1. ${NDK_HOME}/platforms/android-14/arch-arm/usr/include:${NDK_HOME}/sources/cxx-stl/stlport/stlport 

最后Apply -> OK
至此问题解决了。
完。