androidStudio 下 jni开发之初体验

   1.首先,你需要下载Ndk。下载完成后解压到任意目录即可(路径中不要带有中文字符)。我的就直接放在F盘的目录下:

 2.在AS中为你的项目配置NDK。首先新建一个Android工程JNIDemo,Ctrl + shift + alt + s打开Project Structrue把我们刚才下载好的NDK配置进去,点击OK。

 3.配置好NDK后,简单的为我们的项目布局文件添加一个TextView和一个Button,当点击Button的时候,我们通过调用底层自己写好的C/C++代码来返回一个字符串,最后呈现在TextView上。

activity_main.xml布局代码:


```
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        />
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="button"/>
</LinearLayout>
```
MainActivity.java
```
public class MainActivity extends AppCompatActivity {

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

        final TextView textview = findViewById(R.id.textview);
        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textview.setText(JNIUtils.sayHelloFromJNI());
            }
        });
    }
}    	
```

上面代码中的JNIUtils.sayHelloFromeJNI()就是我们在与MainActivity相同的包中新建JNIUtils类后在里面编写的native方法。如下所示:

刚刚创建时我们上面的sayHelloFromJNI()方法显示的是警告红色。把鼠标放到上面,它会提示我们对应的JNI头文件没有查找到。那么接下来我们要做的就是去生成与这个sayHelloFromJNI()方法所对应的头文件。
    4.生成头文件。快捷键alt + F12调出AS下的Terminal窗口,在Terminal命令行窗口中输入如下几条指令,回车:

 

前两个是进入指定目录下的,要生成Java类对应的头文件我们就必须要用到javah这个命令(把jdk一定要配置好,否则会说指令无效)

com.example.bettynail.util.JNIUtils
 就是我们在上面新建的JNIUtils的完整类名了,执行完这几天指令后,刷新一下目录我们就可以在main目录下看到jni这个目录,并且在它里面生成了我们JNIUtils类所对应的头文件。进入头文件中,代码是如下这个样子:

5.头文件生成以后,我们就需要编写我们的C/C++代码了。右键jni目录---->new--->C/C++ Source File

输入要新建的C/C++文件名称JNIHello,这里我们用C++来编写,所以Type为.cpp,如果你选择用C来编写,那么Type选为.c,点击ok。这里说一下,在我们进行NDK开发的时候,选择用C还是C++,在编写代码的时候除了C和C++基本的语法不同外,还是有许多不同地方需要注意。我们后续会慢慢介绍。这里先默认跟着我的步骤来。
 

JNIHello.cpp中的内容如下

切记,在写方法前面记得加extern "C",因为如果要在C++代码调用c的函数,就得用extern "C",因为FFmpeg是c语言的代码,

而cpp文件是c++的,可能在运行时会出现找不到对应的native方法

圈中的地方是我们的JNIUtils的路径,一定不要写错

6.上面的搞定以后,我们需要在app的build.gradle中的defaultConfig中加入如下代码。它表示项目在编译时生成的动态库的名字。

最后呢

我们把加载动态库的代码放到静态代码块中,就是表示在JNIUtils这个类在加载的时候就去加载我们的动态库

然后在app的根目录下创建CMakeLists.txt

这里要跟JNIUtils里面加载的库名要一致否则会加载不出来

还有一个错误是

这是因为项目的jni需要引用一下,在build.gradle下面添加

以前出现类似错误的时候,我们的解决方案一般都是在gradle.properties中添加一行这样的代码:android.useDeprecatedNdk=true就搞定了。但是AS换为3.0后你可以再试一下这种方案,肯定是不行的,它会提示你“Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio.  Please switch to a supported build system.”大体意思就是最新的AS已经不支持useDeprecatedNdk这个标记了,并且在后续版本的AS中,它将被移除。所以我们新的解决方案就是按照它的提示在gradle.properties中添家android.deprecatedNdkCompileLease=1515317190556这行代码。
 

最后点击一下,调用,就可以看到

调用成功了

可以在app-build-intermediates-cmake-debug-obj看到我们的动态so库

记得勾上

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值