【发布时间】:2021-09-09 23:40:05
【问题描述】:
我是 Android Studio 中 JNI 的新手。
我创建了一个空的 Android Java/C++ 项目,现在我想添加第三方库的 .cpp 和 .h 文件以便在我的项目中编译它们。
这是我的项目的结构:
这是MainActivity.java的内容:
package com.example.testcpp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.example.testcpp.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
// Should I add here something like System.loadLibrary("mythirdpartylib"); ???
}
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
// Example of a call to a native method
TextView tv = binding.sampleText;
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();
}
这里是cpp文件夹根目录下的CMakeLists.txt文件内容:
cmake_minimum_required(VERSION 3.10.2)
# Declares and names the project.
project("testcpp")
add_library(native-lib SHARED native-lib.cpp )
find_library(log-lib log )
target_link_libraries( native-lib ${log-lib} )
add_subdirectory(mythirdpartylib)
我的 native-lib.cpp 中的代码:
#include <jni.h>
#include <string>
#include "mythirdpartylib/a.h"
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_testcpp_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
// I would like to be able to call some code from mythirdpartylibrary, for example:
// std::string string2 = mythirdpartylib::getStringFromLib();
return env->NewStringUTF(hello.c_str());
}
我的问题是当我点击文件夹 /mythordpartylib 中的任何 .cpp 文件时出现以下错误:
此文件不是项目的一部分。请将其包含在 适当的构建文件(build.gradle、CMakeLists.txt 或 Android.mk) 并同步项目
我在 /mythirdpartlib/CMakeLists.txt 中添加了这个:
cmake_minimum_required(VERSION 3.10.2)
project("testcpp") # Should I include this line in this subfolder ???
FILE(GLOB MyCSources *.cpp)
但这并不能解决问题。
那么,我应该如何在我的项目中正确包含 mythirdpartylib 呢?我应该怎么做才能在我的编译中包含这个库的 .cpp 文件?完成后,是否会在 libnative-lib.so 中编译thirdpartylib,或者我会有一个额外的 libmythirdpartylib.so 吗?
非常感谢您的帮助!
【问题讨论】:
标签: java android c++ cmake java-native-interface