亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

全部開發者教程

Android Studio 開發 C/C++ 例子

前面的小節我們學習了 C/C++ 支持環境的安裝和配置。本小節我們創建一個最簡單的支持 C/C++ 的項目實例。

1. 創建項目

創建支持原生代碼的新項目的步驟與創建任何其他 Android Studio 項目的步驟相似,但還需要執行一個額外的步驟:

  1. 在向導的 Choose your project 部分中,選擇 Native C++ 項目類型。

  2. 點擊 Next。

  3. 填寫向導下一部分中的所有其他字段。

  4. 點擊 Next

  5. 在向導的 Customize C++ Support 部分中,您可以使用 C++ Standard 字段來自定義項目。使用下拉列表選擇您想要使用哪種 C++ 標準化。選擇 Toolchain Default 可使用默認的 CMake 設置。

  6. 點擊 Finish。

至此,項目創建完成,我們可以看到項目中同時包含了 Java 代碼和 Cpp 代碼。

2. 分析代碼

2.1 Cpp 代碼

項目中包含一個 cpp 源碼文件:native-lib.cpp

extern "C" JNIEXPORT jstring JNICALL
Java_com_imooc_hellojni_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "This string from C++";
    return env->NewStringUTF(hello.c_str());
}

這個函數的功能很簡單,返回一個字串 “This string from C++”。

我們看到這個函數的函數名很長:Java_com_imooc_hellojni_MainActivity_stringFromJNI,這是按特定的規范組織的,分解之后各部分的含義如下:

  • Java:表示是給 Java 源碼中調用的。

  • com_imooc_hellojni_MainActivity:表示由哪個 Java 類(包名類名)來調用。

  • stringFromJNI:表示本地方法名稱,會在 Java 源碼中聲明。

2.2 Java 代碼

項目中包含的 java 源文件:MainActivity.java:

// 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 = findViewById(R.id.sample_text);
    tv.setText(stringFromJNI());
}

/**
 * A native method that is implemented by the 'native-lib' native library,
 * which is packaged with this application.
 */
public native String stringFromJNI();
  • System.loadLibrary:加載我們自己的原生庫 native-lib;

  • setText(stringFromJNI()):把 stringFromJNI 函數返回的字串賦給 TextView 顯示出來;

  • public native String stringFromJNI():聲明本地方法 stringFromJNI。

3. 運行效果

雖然運行效果比較簡單,但是通過前面的代碼分析,我們可以知道,“This string from C++” 這個字串是在 Java 源碼中調用 Cpp 源碼中的函數來獲取的。這是一個最簡單的項目支持 C/C++ 的例子。

4. 小結

本節課程我們主要學習了如何創建一個支持 C/C++ 的項目。本節課程的重點如下:

  • 掌握如何創建支持 C/C++ 的項目;
  • 掌握如何從 Java 中調用 C/C++ 函數。