Android JNI - ' raw'函数无法编译

时间:2017-11-29 18:49:26

标签: android c++ android-ndk java-native-interface

我想弄清楚为什么以下代码在JNI / Android下无法正常工作。

如果我取消注释' raw_function()'从下面的代码中,代码无法使用以下消息进行编译:

  

错误:错误:链接器命令失败,退出代码为1(使用-v查看   调用)

我有两个问题:

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 Standard

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} 

我确信如果我明白我究竟在问什么,我就能更好地说出来。我为了找到答案而进行了很多搜索,但我甚至不知道如何对搜索进行说明。

任何评论都指出我正确的方向,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

您的raw_function()&#39;出现了&#39;链接器的两次:一次,来自文件 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";
}