如何在Android Studio项目中正确包含C ++支持?

时间:2019-01-23 17:09:34

标签: java android cmake android-ndk

我有一个C ++项目,我想在我的android应用程序中使用它。

根据Google's instructions创建了新的应用程序:

  
      
  1. 在向导的“选择项目”部分中,选择“本机C ++项目类型”。
  2.   
  3. 单击下一步。
  4.   
  5. 在向导的下一部分中填写所有其他字段。
  6.   
  7. 单击下一步。
  8.   
  9. 在向导的“自定义C ++支持”部分中,可以使用“ C ++标准”字段自定义项目。使用下拉列表选择要使用的C ++标准化。选择“默认工具链”将使用默认的CMake设置。
  10.   
  11. 单击完成。
  12.   

这是我最终完成的项目: (我没有做任何更改,因此应该是通用的)

native-lib.cpp:

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL 
Java_e_viktor_testinggitapplication_MainActivity_stringFromJNI(JNIEnv *env,

jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

MainActivity.java:

package e.viktor.testinggitapplication;

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

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 = 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();
}

这里我只添加了cmake的版本

等级:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "e.viktor.testinggitapplication"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"         

testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                version "3.10.2"
                cppFlags ""
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
        native-lib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        src/main/cpp/native-lib.cpp)
find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)
target_link_libraries( # Specifies the target library.
        native-lib

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

结果-MainActivity.java中的“无法解析相应的JNI函数”

cpp文件中所有#include的“无法找到字段”和所有类型的“无法解析类型”。

有趣的是,gradle构建成功。

编辑:

添加了CMakeLists.txt

1 个答案:

答案 0 :(得分:0)

我想问题在于缺少NDK,因为将Studio升级到3.3之后,一切都解决了。

针对类似情况的任何人:
即使我在“工具”部分中手动安装了NDK并仅由Android Studio项目自动生成,我仍然遇到此问题。