要使用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