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


(一)创建jni相应的C++文件



1>生成jni相应的头文件



我是这样做的,当我需要在java中调用一些函数的时候,我会把这写函数



单独写在一个.java文件中(当然如果你熟悉jni的一些数据类型的转换以及命名规则后就可以自己写,跳过第(一)步了),



比如如下所示:



UsageJniActivity.java



在终端上先cd到该文件所在的目录

1. public class
2. public native float resultofmultiply(int n1, int
3. public native float calculateGapOfTwoPoint(int nx1, int ny1, int
4. int
5. public native void
6. }



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. } 
36. #endif
37. #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
6. } 
7.   
8. JNIEXPORT jfloat JNICALL JNICALL Java_UsageJniActivity_calculateGapOfTwoPoint( 
9.         JNIEnv * env, jobject thiz, jint nx1, jint ny1, jint nx2, jint ny2) { 
10.   
11. float
12. return
13. } 
14.   
15. JNIEXPORT jstring JNICALL Java_UsageJniActivity_getString( 
16.         JNIEnv * env, jobject thiz) { 
17. char str[] = { "hello everyone"
18. return
19. }


这样关于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
2. # 
3. # Licensed under the Apache License, Version 2.0 (the "License"); 
4. # you may not use this file except in compliance with
5. # You may obtain a copy of the License at
6. # 
7. #      http://www.apache.org/licenses/LICENSE-2.0 
8. # 
9. # Unless required by applicable law or agreed to in
10. # distributed under the License is distributed on an "AS IS"
11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
12. # See the License for the specific language governing permissions and
13. # limitations under the License. 
14. # 
15. LOCAL_PATH := $(call my-dir) 
16.   
17. include $(CLEAR_VARS) 
18.   
19. LOCAL_MODULE    := Calculate 
20. LOCAL_SRC_FILES := Calculate.cpp 
21. LOCAL_LDLIBS := -llog 
22.   
23. 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



至此问题解决了。



完。


转载于:https://blog.51cto.com/qsjming/801101