android jni具体写法
时间: 2023-06-30 22:16:11 浏览: 134
JNI(Java Native Interface)是Java语言和本地代码(如C/C++)之间的接口,可以使Java程序调用本地代码,也可以使本地代码调用Java程序。
下面是一个简单的Android JNI的例子,假设我们有一个本地函数,它可以计算两个整数的和,并返回结果。我们要在Android应用程序中调用这个本地函数。
1.创建本地代码文件
在Android Studio中,我们可以在app/src/main下创建一个名为jni的文件夹,然后在该文件夹下创建一个名为sum.c的C文件。
sum.c的代码如下:
```c
#include <jni.h>
JNIEXPORT jint JNICALL Java_com_example_myapplication_MainActivity_sum(JNIEnv *env, jobject thiz, jint a, jint b){
return a + b;
}
```
其中,Java_com_example_myapplication_MainActivity_sum为本地函数的名称,它遵循一定的命名规则,后面会详细解释。
2.创建JNI头文件
在jni文件夹下创建一个名为sum.h的文件,它的内容如下:
```c
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_myapplication_MainActivity */
#ifndef _Included_com_example_myapplication_MainActivity
#define _Included_com_example_myapplication_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_myapplication_MainActivity
* Method: sum
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_myapplication_MainActivity_sum
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
```
3.配置build.gradle文件
在app/build.gradle文件中,添加以下内容:
```groovy
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
}
...
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
//添加以下内容
android {
...
//指定编译版本
ndkVersion "21.3.6528147"
...
externalNativeBuild {
cmake {
//指定cmake版本
version "3.10.2"
//指定CMakeLists.txt文件路径
path "CMakeLists.txt"
}
}
...
}
```
4.创建CMakeLists.txt文件
在jni文件夹下创建一个名为CMakeLists.txt的文件,它的内容如下:
```cmake
cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp )
#添加以下内容
add_library( # Sets the name of the library.
sum
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
sum.c )
#搜索log库
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
#链接库
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
#添加以下内容
#链接库
target_link_libraries( # Specifies the target library.
sum
# Links the target library to the log library
# included in the NDK.
${log-lib} )
```
5.在Java中调用本地函数
在MainActivity.java文件中,添加以下代码:
```java
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("sum");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//调用本地函数sum
int result = sum(1, 2);
Log.d("MainActivity", "sum result = " + result);
}
//在Java中声明本地函数sum
public native int sum(int a, int b);
}
```
6.编译并运行应用程序
现在,我们可以编译并运行应用程序了。在Android Studio中,点击菜单栏中的Build->Make Project,然后点击运行按钮即可。运行结果如下:
```java
D/MainActivity: sum result = 3
```
这就是一个简单的Android JNI的例子,它演示了如何在Android应用程序中调用本地函数。
阅读全文