需要源码请点赞关注收藏后评论区留言~~~
一、创建JNI接口
JNI提供了若干API实现Java和其他语言的通信。虽然JNI是Java平台的标准,但是要想在Android上使用JNI,还得配合NDK,NDK提供了C/C++标准库的头文件和标准库的链接文件,而JNI开发只是在App工程下编写C/C++代码,代码必须包含NDK提供的头文件,build.gradl和mk文件依据编译规则把标准库链接进去,编译完成形成最终的so动态库文件,这样才能在App中通过Java代码调用JNI接口。
下面以获取CPU指令集为例,简要介绍JNI开发具体步骤
1:确保NDK环境搭建完成 并且本模块已经添加了对NDK的支持
2:在活动代码中添加JNI接口定义 并在初始化时加载JNI动态库
3:转到工程的jni目录下,在h文件,c文件,cpp文件中编写C/C++代码
工程目录结构如下
以上开发步骤需要注意以下几点
1:数据类型转换
2:编译规则定义
3:开发注意事项
运行效果如下 调用CPU的指令集
代码如下
Java类
package com.example.ebook; import android.annotation.SuppressLint; import android.os.Build; import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; @SuppressLint("SetTextI18n") public class JniCpuActivity extends AppCompatActivity { private TextView tv_cpu_jni; // 声明一个文本视图对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_jni_cpu); TextView tv_cpu_build = findViewById(R.id.tv_cpu_build); tv_cpu_build.setText("Build类获得的CPU指令集为" + Build.CPU_ABI); tv_cpu_jni = findViewById(R.id.tv_cpu_jni); findViewById(R.id.btn_cpu).setOnClickListener(v -> { // 调用JNI方法cpuFromJNI获得CPU信息 String desc = cpuFromJNI(1, 0.5f, 99.9, true); tv_cpu_jni.setText(desc); }); } // 声明cpuFromJNI是来自于JNI的原生方法 public native String cpuFromJNI(int i1, float f1, double d1, boolean b1); // 在加载当前类时就去加载libcommon.so,加载动作发生在页面启动之前 static { System.loadLibrary("common"); } }
XML文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="5dp" > <TextView android:id="@+id/tv_cpu_build" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="17sp" /> <Button android:id="@+id/btn_cpu" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="调用jni接口获取指令集" android:textColor="@color/black" android:textSize="17sp" /> <TextView android:id="@+id/tv_cpu_jni" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>
创作不易 觉得有帮助请点赞关注收藏~~~