gpt4 book ai didi

Android JNI - 'raw' 函数编译失败

转载 作者:行者123 更新时间:2023-11-30 05:07:15 26 4
gpt4 key购买 nike

我正在尝试找出为什么以下代码在 JNI/Android 下无法运行。

如果我取消注释下面代码中的“raw_function()”,代码将无法编译并显示以下消息:

Error:error: linker command failed with exit code 1 (use -v to see invocation)

我有两个问题:

1) 我不知道如何使用 -v 来查看调用 - 我应该在哪里执行此操作?

2) 当我取消注释该特定行时,我不知道为什么代码没有编译。将该函数移动到类 (Header_Test) 中也可以解决问题,但为什么呢?

我已经包含了下面项目中的几乎所有内容。唯一感兴趣的区域应该是 header_test.h 和 native-lib.cpp。

我意识到将函数放在全局命名空间中是不好的做法。此代码纯粹用于测试目的。

项目详情:

  • Android Studio 3.0.1
  • CMake 3.6.4111459
  • NDK 15.2.4203891
  • C++ 14 标准

header_test.h

#ifndef TESTCPLUSPLUSCHRONO_HEADER_TEST_H
#define TESTCPLUSPLUSCHRONO_HEADER_TEST_H
#include <string>

class Header_Test {
public:
static std::string get_name() {
return "Header Test";
}
};

/*std::string raw_function() {
return "Raw function";
}

#endif //TESTCPLUSPLUSCHRONO_HEADER_TEST_H

native-lib.cpp

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

extern "C"
JNIEXPORT jstring

JNICALL
Java_com_test_android_testrawfunctiontest_MainActivity_stringFromJNI(
JNIEnv *env,
jobject) {
std::string hello;
hello = Header_Test::get_name();

return env->NewStringUTF(hello.c_str());
}

额外的细节(这不应该影响主要代码):

header_test.cpp

#include "header_test.h"

MainActivity.java

package com.test.android.testrawfunctiontest;

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

public class MainActivity extends AppCompatActivity {

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 = (TextView) findViewById(R.id.sample_text);
String jniText = stringFromJNI();
tv.setText(jniText);
String filler = "-------------------";
System.out.println(filler);
System.out.println("Text from JNI: " + jniText);
System.out.println(filler);
}

public native String stringFromJNI();
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

add_library(native-lib SHARED
src/main/cpp/native-lib.cpp
src/main/cpp/header_test.cpp )

find_library(log-lib log )

target_link_libraries(native-lib ${log-lib}

我敢肯定,如果我明白我到底在问什么,我就能更好地表达这个意思。我进行了很多搜索,试图找到这个问题的答案,但我什至不知道如何用短语来搜索。

任何为我指明正确方向的评论都将不胜感激。

最佳答案

你的 raw_function()对于链接器“出现”两次:一次来自文件 native-lib.cpp,还有一次来自 header_test.cpp。为避免冲突,您可以声明它 inlinestatic .结果会有所不同:在后一种情况下,您的 native-lib 将有两个独立的函数 raw_function() ,每个都可以从其自己的 cpp 文件中看到:

inline std::string raw_function() {
return "Raw function";
}

static std::string raw_function() {
return "Raw function";
}

关于Android JNI - 'raw' 函数编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47559720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com