Android jni开发入门

首先先来认识:NDK 和 JNI介绍

JNI (Java Native Interface)是一套编程接口,用来实现java代码和其他语言(c、C++或汇编)进行交互。这里需要注意的是JNI是JAVA语言自己的特性,也就是说JNI和Android没有关系。在Windows下面用JAVA做开发也经常会用到JNI,例如:读写系统注册表等。

NDK(Native Development Kit)是Google提供的一套工具集,可以让你其他语言(C、C++或汇编)开发 Android的 JNI。NDK可以编译多平台的so,开发人员只需要简单修改 mk 文件说明需要的平台,不需要改动任何代码,NDK就可以帮你编译出所需的so。

一、下载配置ndk开发环境。

file-->setting-->Appearance & Behavior-->System Settings-->Android SDK-->SDK Tools,选中CMake、LLDB、NDK,Apply-OK。

二、Android studio配置NDK路径。

file-->Project Sturcture-->SDK Location-->Android NDK location: 直接点击下边的按钮,自动添加-->OK。

三、配置环境变量。

将上面的NDK路径,复制下来,配置到系统Path上。类似SDK那样。

四、开始写demo,新建myserialport项目,在gradle.properties添加一行,

android.useDeprecatedNdk=true

并在java下新建android_serialport_api目录。新建SerialPort类。

public class SerialPort{
    public static native String helloJni();
    public static native int addCalc(int a, int b);
    //加载SO文件
    static {
        System.loadLibrary("SerialPort"); // 注意没有前缀lib和后缀.so
    }

}

这之后会报错,不要管,build一下。

五、在Terminal栏,cd 到app\build\intermediates\classes\debug,然后用执行命令

javah -classpath android.jar的绝对路径;. -jni android_serialport_api.SerialPort 回车,

生成c/c++头文件android_serialport_api_SerialPort.h。

六、在main下新建jni文件夹,并将生成的android_serialport_api_SerialPort.h文件移动到此。

七、jni下新建android_serialport_api_SerialPort.cpp文件,

#include <android_serialport_api_SerialPort.h>
JNIEXPORT jstring JNICALL Java_android_serialport_api_SerialPort_helloJni
  (JNIEnv *env, jclass jobj) {
    return (*env)->NewStringUTF(env,"SerialPort JNI!");
}

JNIEXPORT jint JNICALL Java_android_serialport_api_SerialPort_addCalc
  (JNIEnv *env, jclass jobj, jint ja, jint jb) {
  return ja + jb;
}

八、修改gradle 配置,


android {
    ...
    defaultConfig {
        ...

        sourceSets{
            main{
                jniLibs.srcDirs=["libs"]
            }
        }
        ndk{
            moduleName "SerialPort"
            abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
            ldLibs "android","log","EGL"
        }
    }
  

九、测试。

        SerialPort port=new SerialPort();
        tv_result.setText(port.helloJni());
        tv_result1.setText(port.addCalc(13,24)+"");

到此为止,以下是生成so文件并使用导入so文件。

十、生成.so文件,jni下新建Android.mk文件。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := SerialPort
LOCAL_C_INCLUDES := ${LOCAL_PATH}
LOCAL_SRC_FILES := SerialPort.cpp
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)

十一、除了jniLibs下面的so文件移动到app/libs,obj、jni、jniLibs全删掉。重新运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值