JNI开发应该是最详细的步骤了

1 篇文章 0 订阅

关于Android的NDK开发你需要了解的

JNI,JNI(Java Native Inteface)是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。尤其是c/c++,但是并不妨碍你使用其他语言,只要调用约定支持就可以了。
这里,将详细记录我的NDK开发的踩坑之路。

NDK开发环境的配置

一 ,Android Studio中早已支持NDK的导入,AS版本上的环境配置。
这里写图片描述
当你在项目中使用的时候
这里写图片描述
做完上面这一部的话,你可以去你的SDK路径下去看看了,你将看到

    E:\AndroidSDK\sdk\ndk-bundle

的路径,很好了,NDK你已经下载完毕。(这里自动下载最新版的)

二 ,当然你自己也可以去NDK的官网下载最新版的NDK。

NDK下载

  下载到自己容易找到到的目录。

三,对于前两种的下载方式,希望选择第一种,因为还能下载调试工具,虽然我不讲,但以后会用到的。剩下的我们就是在系统的环境变量中配置NDK路径。
这里写图片描述

这里写图片描述

路径就这样也就配置好了。

四,我们在DOS操作界面检测一下,你输入

ndk-build

这里写图片描述

出现上面的信息的话也就证明你的环境成功了。

在Android Studio中使用

上面我们已经配置了好了环境,接下来就一步步带你实现自己的JNI开发的第一步!

一,在app级别的build文件中

 defaultConfig {
        applicationId "com.example.administrator.myndkceshi"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        //以下两条需加入
        sourceSets.main {
            jniLibs.srcDir 'src/main/libs'
        }
        ndk {
            moduleName 'helloword'
        }

同步一下,看下出错什么的吗,如果出错,请检查上面的AS的环境配置中的第二张截图,选择了NDK目录了吗。
还有根据提示需要在gradle.properties中设置android.useDeprecatedNdk=true。

二,创建你调用So库的CLass,因为你现在还没有根据 .C文件生成,我们先写上,调用native的方法吧。

这里写图片描述

这里会提示当前没有 HelloWord这个方法。不着急,我们慢慢来。

这里,我们在main 目录下创建 jni 的目录 ,为下一步在此目录生成相应文件

三,接下来我们应该根据这个Class 生成相应的 .h 文件,它的语法规则很麻烦,但我们可以不去掌握的它的生成规则。可以利用 javah 自动生成

记住,这里一定要在你的 app 目录级别下去生成(我是这么做的,其他也能生成,但感觉这样好记忆一点)

javah -d src/main/jni/ -classpath build/intermediates/classes/debug/ com.example.administrator.myndkceshi.HelloJni
//-d 指定生成的目录路径
// -classpath build build之后,会在debug目录下生成.class文件的
//最后面就是你的完整类名了

如果这里出现问题,请你更换下自己moudel的名字,也就成功了。

四,.h文件生成完毕,我们就开始 做 .c文件了

.c文件

#include "com_example_administrator_myndkceshi_HelloJni.h"



JNIEXPORT jint JNICALL
Java_com_example_administrator_myndkceshi_HelloJni_HelloWord(JNIEnv *env, jobject instance, jint a) {

        if (a >10) {
            return 100;
        }

        if(a<10){
            return 300;
        }

    return 400;
}

Application.mk文件

 APP_MODULES := helloword
  APP_ABI :=all

Android.mk文件

 LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE :=helloword

LOCAL_SRC_FILES =: com_example_administrator_myndkceshi_HelloJni.c
include $(BUILD_SHARED_LIBRARY)

仔细看,我们注意到包名有所变化,写的.c文件 也不用我们太关心,只要 .h文件是正常的请求头就好。

五,到这一步,我们的 jni 调试已经完成了一大半了,剩下的就开始编译吧。

我们从 Dos界面 进入到 jni目录

在此目录下执行操作

ndk-build

你可能在AS下直接用它的 terminal 进行操作,不好意思,可能会行不通。看系统了吧。

执行完编译的后 我们会看到以下的目录结构这里写图片描述

obj目录你可以删除,我们只保留libs 目录即可。编译完成,你可以正常调用.C文件的方法了。

别忘了,我们还需要在 我们调用的的Class 中 加载编译生成的SO库,

public class HelloJni {
     static {
        //加载.so类库,加载的名称去掉lib
        System.loadLibrary("helloword");
    }
    public native int HelloWord(int a);
}

OK ,完事,你可以在其他界面调用了。

 HelloJni helloJni = new HelloJni();
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText(helloJni.HelloWord(220)+"");

本例子虽然简单,但是步骤详细,是你jni开发了解详细步骤的不多见的例文,后面我附上源码,需要的请star.

JNIDemo

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值