### JNI编写步骤详解 #### 一、概述 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中尤其重要,因为这使得开发者可以在性能要求较高的场景下使用C或C++来编写程序,并通过JNI与Java层进行通信。 #### 二、JNI编写步骤 ##### 1. 创建JNI接口 在Java层定义一个类,并声明native方法。这些方法将被C/C++代码实现。 ```java public class MainActivity { static { System.loadLibrary("Hello"); // 加载C/C++编译后的动态库 } // 声明native方法 public native String hellofromc(); } ``` ##### 2. 生成JNI头文件 使用`javah`工具自动生成JNI头文件,该文件包含了C/C++函数签名,与Java层的native方法相对应。 ```sh javah -jni com.itheima.speektest.MainActivity ``` 生成的头文件如下: ```c /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_itheima_speektest_MainActivity */ #ifndef _Included_com_itheima_speektest_MainActivity #define _Included_com_itheima_speektest_MainActivity #ifdef __cplusplus extern "C" { #endif /* * Class: com_itheima_speektest_MainActivity * Method: hellofromc * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_itheima_speektest_MainActivity_hellofromc (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif ``` ##### 3. 编写C/C++代码 根据生成的头文件,实现native方法的具体逻辑。 ```c #include <jni.h> #include <stdio.h> // 实现Java_com_itheima_speektest_MainActivity_hellofromc jstring Java_com_itheima_speektest_MainActivity_hellofromc(JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env, "hello android from C"); } ``` ##### 4. 配置NDK编译环境 为了能在Android平台上编译C/C++代码,需要配置NDK编译环境。 1. **创建Android.mk文件**: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := Hello LOCAL_SRC_FILES := Hello.c include $(BUILD_SHARED_LIBRARY) ``` 2. **编译C/C++代码**: 在命令行中切换到项目目录,执行编译命令。 ```sh cd /path/to/project ndk-build ``` 3. **加载动态库**: 在Java层通过`System.loadLibrary`加载编译好的动态库。 ##### 5. 使用日志 为了方便调试,可以在C/C++代码中使用Android的日志系统。 ```c #include <android/log.h> #define LOG_TAG "System.out.c" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) // 使用示例 LOGD("Debug message."); LOGI("Info message."); ``` #### 三、其他注意事项 - **静态方法调用**:如果Java层的方法为静态方法,则需要使用`GetStaticMethodID`和`CallStaticVoidMethod`等API进行调用。 - **环境配置**:确保Cygwin或其他开发环境正确安装并配置了Android NDK路径。 - **调试技巧**:使用`javap -s`查看类文件中的符号表,有助于理解JNI的调用机制。 通过以上步骤,可以完成从Java到C/C++的跨语言调用,从而充分发挥JNI在Android开发中的优势。
2、新建一个名为jni的包:在其包下创建一个C文件和android.mk文件
C文件的例子:
#include<stdio.h>
#include <jni.h>
jstring Java_com_itheima_speektest_MainActivity_hellofromc(JNIEnv* env,jobject obj){
return (*(*env)).NewStringUTF(env,"hello android from c");
}
mk文件的格式:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Hello(这是想要生成的文件的名字)
LOCAL_SRC_FILES := Hello.c (这是自己创建的C文件的名称)
include $(BUILD_SHARED_LIBRARY)
在要调用C函数的android程序中,static{
System.loadLibrary("Hello");//导入编译好的C文件
}
然后再声明一下要调用的函数public native String hellofromc();
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助