Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android studio | openGL es 3.0增強現實開發 (1) 建立一個openGL es 3.0開發環境

android studio | openGL es 3.0增強現實開發 (1) 建立一個openGL es 3.0開發環境

編輯:關於Android編程

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

NDK:Native Development Kit(原生開發工具包), NDK允許用戶使用類似C / C++之類的原生代碼語言執行部分程序。它包括下面的部分(1)從C / C++生成原生代碼庫所需要的工具和build files。(2)將一致的原生庫嵌入可以在Android設備上部署的應用程序包文件(application packages files ,即.apk文件)中。(3)支持所有未來Android平台的一系列原生系統頭文件和庫

優點:

代碼的保護,由於apk的java層代碼很容易被反編譯,而C/C++庫反匯難度較大。 在NDK中調用第三方C/C++庫,因為大部分的開源庫都是用C/C++代碼編寫的。 便於移植,用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




    

建立如下目錄

這裡寫圖片描述

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 
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,到這裡,誰能體會本文內心的陰影面積,故做此文希望大家少走彎路,一次成功。

16最後,如何查看自己生成的.so文件名呢,這樣就可以保證在加載庫的時候不出錯,如下圖中所示,不要前面的lib就是生成的.so文件名。

這裡寫圖片描述

17如何判斷NDK是否有安裝,或是正確安裝那?

這裡寫圖片描述

18如何讓自己快速學習,少走彎路,做事快人一步呢?加入上面的群,關注上面的公眾號你將所向披靡。

19.源碼github地址:傳送門

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved