android studio | openGL es 3.0增强现实(AR)开发 (1) 建立一个openGL es 3.0开发环境

1.什么是NDK,什么是JNI?

NDK:Native Development Kit(原生开发工具包), NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。它包括下面的部分(1)从C / C++生成原生代码库所需要的工具和build files。(2)将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。(3)支持所有未来Android平台的一系列原生系统头文件和库

优点:

  1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
  2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。
  3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。

JNI:Java Native Interface,(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。

随意NDK和JNI和关系是:NDK是基于JAVA JNI技术所开发的一套应用于android编程的一系列工具集合

2.检查自己的IDE版本(最好用1.3之后的版本)和SDK,NDK版本,此处我这边没安装NDK,下面想办法安装。

这里写图片描述
这里写图片描述

3.新建一个工程,配置里面的NDK工程路径

这里写图片描述

4.到这里基本环境就搞定了,下面开始建立一个自己的新工程,用来做openGL es 3.0开发的第一步

配置文件main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.dragon.opengles01.Main">

    <TextView
        android:id="@+id/ndk_test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         />
</RelativeLayout>

建立如下目录

这里写图片描述

NDKTest.java中代码如下

package com.dragon.opengles01.ndk;

/**
 * This file created by dragon on 2016/7/31 0:25,
 * belong to com.dragon.opengles01.ndk .
 */
public class NDKTest {

    public native static String hello();
//    默认是NDK.moduleName
    static {
        System.loadLibrary("ndk_test");//此处是生成.so文件
    }
}

5.rebuild一下项目,会在debug目录下生成NDKTest的.class文件,如下所示

这里写图片描述

6.通过终端进入个目录,用javah生成.h的头文件

javah -jni com.draogn.opengles01.ndk.NDKTest

这里写图片描述

7.接下来在main目录下面建一个jni目录,在customize the activity选项卡下选择 change folder location

这里写图片描述
这里写图片描述

8.将javah生成的.h头文件拷贝或是剪切到jni目录中去,然后在jni目录下创建一个filename.cpp的C++文件,其中filename的名子可以随便取,一般是采用java+packageName+className这种方式

这里写图片描述

在C++文件中敲入下面代码

#include "com_dragon_opengles01_ndk_NDKTest.h"
#include <string.h>
JNIEXPORT jstring JNICALL Java_com_dragon_opengles01_ndk_NDKTest_hello
        (JNIEnv *env, jobject obj)
{
    return env->NewStringUTF("我是来自NDK的C++");
}

9 build->Rebuild Project,如果有下面的错误

这里写图片描述

是因为你先操作的终端没退出来有两种解决办法1.你敲回原工程路径,如本人的如下

这里写图片描述

2.另一种方式是重启IDE,这样你再整的时候就可以了

10,然后重启Rebuild一下,席八,又出红了,根据IDE的提示需要在gradle.properties的末尾添加一行代码,很明显这个是干嘛用的。

android.useDeprecatedNdk=true

11.接下来尝试从main Activity中调用一下代码

package com.dragon.opengles01;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import com.dragon.opengles01.ndk.NDKTest;

public class Main extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView textView = (TextView) findViewById(R.id.ndk_test);
        String str = NDKTest.hello();
        textView.setText(str);
    }

}

12.然后跑一下,又红了,加载类出错,需要在App模块下的gradle文件中添加

    ndk {
            moduleName "ndk_test"          //生成的so名字
            abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库,目前可有可无
        }

添加的地方如下,别添加错了,生成的.so名字要和之前生成的一致,如果你不知道你生成的.so文件是什么名,请看下面。

这里写图片描述

13.最后,跑一下,成功了吗?毛啊,又红了,老提示下面错问题

这里写图片描述

原因:jni周意男下的.h和.cpp中声明的头文件和实现文件不一致,解决办法,修改其中之一,一般.h文件是自动生成的,所以建议不修改,一般要修改的话,修改.cpp文件中的内容,修改成如下

这里写图片描述

14.最后成功了,废话不多说,上图

这里写图片描述

15,到这里,谁能体会本文内心的阴影面积,故做此文希望大家少走弯路,一次成功。


如果你还有问题没解决,你可以加入我们一起交流,专注于AR的在移动端的实现

这里写图片描述

或是关注我们的技术公众号,提供技术干货的地方,你有干货可以联系本人代发。

这里写图片描述

如果你觉得写的不错,对你有用,请在下面点个 支持一下嘛,有问题可以在下面留言评论。


16最后,如何查看自己生成的.so文件名呢,这样就可以保证在加载库的时候不出错,如下图中所示,不要前面的lib就是生成的.so文件名。

这里写图片描述

17如何判断NDK是否有安装,或是正确安装那?

这里写图片描述

18如何让自己快速学习,少走弯路,做事快人一步呢?加入上面的群,关注上面的公众号你将所向披靡。

19.源码github地址:传送门

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页