【Android】Android的JNI基础编程

Android的JNI基础编程

代码下载:Android JNI程序下载

编程环境:

Android Studio 3.4

compileSdkVersion 28

minSdkVersion 22

targetSdkVersion 28

目录

Android的JNI基础编程

1. 环境配置

2. 简单的JNI程序

2.1 创建工程项目

2.1 新建Java项目(用于调用C程序)

2.3 配置JNI调用(生成库文件、C程序)  

2.4 运行结果

3、JNI程序传递参数调用 

3.1 新建JNI类,添加checkUser()方法

3.2 生成头文件

 3.3 编写Java调用的C程序

3.4 修改Android.mk,添加需要编译的C文件,编译 

3.5 MainActivity.java中调用JNI类中的checkUser()方法 

3.6  实验结果 

3.7 调用步骤 

4. JNI更新UI界面

4.1 界面中增加一个按钮,用于开启线程 

4.2 Handler机制更新UI 

4.3 子线程中 

4.4 运行结果 

5. C程序调用Java方法

5.1 调用顺序 

5.2 新建一个Java方法(用于调用C程序) 

5.3 在前文JNI类中编写(被C调用的)Java方法 

5.4 C程序中testsum.c中调用Java方法 

5.5 运行结果 


1. 环境配置

Android Studio 中SDK Manager下载NDK、LLDB、CMake

【Android】Android的JNI基础编程_第1张图片

2. 简单的JNI程序

2.1 创建工程项目

【Android】Android的JNI基础编程_第2张图片

【Android】Android的JNI基础编程_第3张图片

2.1 新建Java项目(用于调用C程序)

1、在与MainActivity.java同级目录下创建JNITest.java

【Android】Android的JNI基础编程_第4张图片

2、编写JNITest.java 

【Android】Android的JNI基础编程_第5张图片

 3、MainActivity.java中调用get()方法

 【Android】Android的JNI基础编程_第6张图片

4、编写 activity_main.xml

【Android】Android的JNI基础编程_第7张图片

2.3 配置JNI调用(生成库文件、C程序)  

 1、Build->Make Project生成JNITest.class文件

(目录形式切换为Project查看.class文件,不同版本的AS位置可能不同) 

 【Android】Android的JNI基础编程_第8张图片 

2、\app\src\main目录下创建jni目录 

【Android】Android的JNI基础编程_第9张图片

【Android】Android的JNI基础编程_第10张图片

3、生成头文件(.h) 

(1)在D:\Android_NDK\app\src\main\java目录下生成com.example.android_ndk.JNITest.h头文件

(2)Terminal中执行如下指令,生成头文件

 

【Android】Android的JNI基础编程_第11张图片

(3)复制com.example.android_ndk.JNITest.h头文件复制到jni目录下

(4)com.example.android_ndk.JNITest.h可能出现问题

   #include报错

   解决方式,给出jni.h的完整目录,例如:

 (5)jni目录新建C程序(Name为test,Type为.c)

 【Android】Android的JNI基础编程_第12张图片

 【Android】Android的JNI基础编程_第13张图片

 注意1:与com.example.android_ndk.JNITest.h中保持一致

4、jni目录下创建Android.mk 

添加:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS)

LOCAL_MODULE := JNITest

LOCAL_SRC_FILES := test.c

include $(BUILD_SHARED_LIBRARY)

5、jni目录下创建Application.mk

【Android】Android的JNI基础编程_第14张图片

添加:

APP_MODULES :=JNITest

APP_ABI := all

6、修改build.graddle

主要记录库文件中的位置

【Android】Android的JNI基础编程_第15张图片

【Android】Android的JNI基础编程_第16张图片

 

ndk{
    moduleName "JNITest"
}
sourceSets.main{
    jni.srcDirs = []
    res.srcDirs = ['src/main/res']
    assets.srcDirs = ['src/main/assets']
    manifest.srcFile 'src/main/AndroidManifest.xml'
    jniLibs.srcDirs = ['src/main/libs']
    jniLibs.srcDir "src/main/libs"
}

7、生成库文件

Terminal中进入jni目录下,输入命令ndk-build

【Android】Android的JNI基础编程_第17张图片

2.4 运行结果

【Android】Android的JNI基础编程_第18张图片

3、JNI程序传递参数调用 

(Java调用C,判断传递参数是否相同)

3.1 新建JNI类,添加checkUser()方法

【Android】Android的JNI基础编程_第19张图片

3.2 生成头文件

方法与前文类似

【Android】Android的JNI基础编程_第20张图片

 3.3 编写Java调用的C程序

jni目录下,新建checkuser.c(JNI类中checkUser()方法将调用此C程序 

【Android】Android的JNI基础编程_第21张图片

3.4 修改Android.mk,添加需要编译的C文件,编译 

【Android】Android的JNI基础编程_第22张图片

 

3.5 MainActivity.java中调用JNI类中的checkUser()方法 

【Android】Android的JNI基础编程_第23张图片

3.6  实验结果 

3.7 调用步骤 

4. JNI更新UI界面

 

4.1 界面中增加一个按钮,用于开启线程 

【注】子线程用于控制UI界面的更新

 【Android】Android的JNI基础编程_第24张图片

4.2 Handler机制更新UI 

主线程中handleMessage

【Android】Android的JNI基础编程_第25张图片

4.3 子线程中 

根据C程序中返回的值,通过sendMessage方法,传递给UI更新的内容

【Android】Android的JNI基础编程_第26张图片

4.4 运行结果 

运行前: 

 【Android】Android的JNI基础编程_第27张图片

运行后: 

【Android】Android的JNI基础编程_第28张图片

 

5. C程序调用Java方法

5.1 调用顺序 

 

5.2 新建一个Java方法(用于调用C程序) 

 【Android】Android的JNI基础编程_第29张图片

5.3 在前文JNI类中编写(被C调用的)Java方法 

 【Android】Android的JNI基础编程_第30张图片

5.4 C程序中testsum.c中调用Java方法 

 【Android】Android的JNI基础编程_第31张图片

5.5 运行结果 

 【Android】Android的JNI基础编程_第32张图片

你可能感兴趣的:(Android)