我想弄清楚为什么以下代码在JNI / Android下无法正常工作。
如果我取消注释' raw_function()'从下面的代码中,代码无法使用以下消息进行编译:
错误:错误:链接器命令失败,退出代码为1(使用-v查看 调用)
我有两个问题:
1)我不知道如何使用-v来查看调用 - 我会在哪里这样做?
2)当我取消注释该特定行时,我不知道为什么代码没有编译。将该函数移入类(Header_Test)也可以解决问题,但为什么呢?
我已经包含了以下项目中的所有内容。唯一感兴趣的领域应该是header_test.h和native-lib.cpp。
我意识到将函数放在全局命名空间中是不好的做法。此代码纯粹用于测试目的。
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
天然-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}
我确信如果我明白我究竟在问什么,我就能更好地说出来。我为了找到答案而进行了很多搜索,但我甚至不知道如何对搜索进行说明。
任何评论都指出我正确的方向,我们将不胜感激。
答案 0 :(得分:1)
您的raw_function()
&#39;出现了&#39;链接器的两次:一次,来自文件 native-lib.cpp ,还来自 header_test.cpp 。为避免冲突,您可以声明inline
或static
。结果会有所不同:在后一种情况下, native-lib 将有两个独立的函数raw_function()
,每个函数都可以从自己的cpp文件中看到:
inline std::string raw_function() {
return "Raw function";
}
或
static std::string raw_function() {
return "Raw function";
}