Android Studio 3.2创建JNI

一、使用自带的Cmake(AS2.2以上版本支持)

新建项目时,在引导界面勾选Include c++ support;c++ standard 版本根据需要选择,推荐选最新的。一路点完,项目开始build了,你可能会发现如下报错

A problem occurred configuring project ':app'.

1.配置NDK

如果之前未勾选Include c++ support的项目默认build都是正常的,那么基本上就是你没配置ndk的原因,首先确认是否下载过ndk,没有话可以去官网下载,地址

https://developer.android.google.cn/ndk/downloads/

ndk下载界面
注意下载的时候选择稳定版本,测试版说不好就有坑。下载之后解压到SDK目录下ndk-bundle
ndk解压路径
有些小伙伴可能在SDK Manager里面看到有NDK,然后直接下载了。额,反正一开始我是这么干的,然后下载的ndk-build报错:make (e=2): 系统找不到指定的文件,原因就是下载的版本是最新的18.1,不稳,只能去官网下载个稳定版解决
SDK Manager
下载好NDK后,在File-Project structure中添加下路径,重新build。在这里插入图片描述

2.Cmake

Failed to find CMake.
Install CMake and sync project

这个报错是SDK下面没Cmake,安装下即可。正常项目创建完成目录结构如下
在这里插入图片描述
然后直接点Run就可以了(如果你想添加其他文件,记得在CmakeLists.txt中加入新的文件路径),但是在AS目录上,并不会显示so库,只有编译出来的apk里面能看见。
在这里插入图片描述

附加一篇CMakeLists.txt的说明博客:AndroidStudio项目CMakeLists解析

二、使用传统的ndk-build编译生成so库

讲道理,感觉Cmake真的很方便了,但是有时候直接copy来的源码和mk文件,就懒得再去加到CmakeLists.txt了,想着ndk-build也不算麻烦,就两个都用下吧。

1、创建jni目录下文件

在File-Settings-Tools-External Tools加个javah,用来自动生成Java中native方法的头文件

Program: JDKPath$\bin\javah.exe
Arguments:  -classpath . -jni -d $ModuleFileDir$\src\main\jni $FileClass$
Working directory:  $ModuleFileDir$\src\main\Java

这个相当于terminal中在src\main目录下执行

javah -d jni -classpath ./Java 完整java类名

再加个ndk-build,用来编译生成so库,ndk的目录可能不同,需要注意。

Program: C:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle\android-ndk-r16b\ndk-build.cmd
Arguments:  不用写
Working directory:  $ProjectFileDir$\app\src\main

这个相当于terminal中在src\main目录下使用ndk-build.cmd,最好给这个配置下环境变量,完整路径太长了。

C:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle\android-ndk-r16b\ndk-build.cmd

在这里插入图片描述
然后点击我们的java文件,选择Tools-external tools-javah,运行之后就看见多出来了jni下面com_oldsix_jnidemo_JniHelper.h文件,编写Android.mk、Appliction.mk以及cpp文件。
在这里插入图片描述
在这里插入图片描述
Android.mk内容

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := jnitest
LOCAL_SRC_FILES =: jnitest.cpp
include $(BUILD_SHARED_LIBRARY)

Application.mk内容

APP_MODULES := jnitest
APP_ABI := all
APP_STL := c++_shared

执行下开始加的Tools中的ndk-build,就可以看到编译出来的so库了
在这里插入图片描述

在默认的代码基础上改下:

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    /*static {
        System.loadLibrary("native-lib");
    }*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(new JniHelper().getStringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    //public native String stringFromJNI();
}

public class JniHelper {
    static {
        System.loadLibrary("jnitest");
    }

    public native String getStringFromJNI();
}

然后app下面的build.gradle中记得改下path,

    externalNativeBuild {
        ndkBuild {
            path file('src/main/jni/Android.mk')
        }
        /*
            cmake {
                path "CMakeLists.txt"
            }
        */
    }

运行下,成功了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值