当前位置: 首页 > 知识库问答 >
问题:

NDK-链接共享库

袁炳
2023-03-14

我试图将我编译的简单共享库(libhello.so)链接到我的本机C++代码中。库libhello.so文件是:
1。Get13.h

#ifndef GET13_H
#define GET13_H
int get13();
#endif

2.get13.cpp

#include "get13.h"

int get13() {
    return 13;
}

Android文件是:
1。myapplication/jni/android.mk

LOCAL_PATH := $(call my-dir)

LOCAL_MODULE := libhello
LOCAL_SRC_FILES := libhello.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := native-lib
LOCAL_SRC_FILES := native-lib.cpp
LOCAL_SHARED_LIBRARIES := libhello
include $(BUILD_SHARED_LIBRARY)
APP_STL := gnustl_static
APP_PLATFORM := android-24
#include <jni.h>
#include <string>
#include <sstream>
extern "C"{
#include <get13.h>
JNIEXPORT jint JNICALL
Java_com_example_semko_myapplication_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject asdf) {
    get13();
    return 1;
}
}
apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    defaultConfig {
        applicationId "com.example.semko.myapplication"
        minSdkVersion 24
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    sourceSets.main {
        jni.srcDirs = []
        jniLibs.srcDir '../jni'
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        ndkBuild {
            path '../jni/Android.mk'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:24.2.1'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
}
package com.example.semko.myapplication;

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);

        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(Integer.toString(stringFromJNI()));
    }

    public native int stringFromJNI();
}

问题是,在gradle构建过程中,我在文件native-lib.cpp中得到了这个错误:

Error:(10) undefined reference to `get13'
Error:error: linker command failed with exit code 1 (use -v to see invocation)

我使用android NDK包中包含的make_standalone_toolchain.py脚本生成的android toolchain编译了libhello。

共有1个答案

牧熙云
2023-03-14

只有JNI函数本身应该标记为extern“c”,如下所示:

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

extern "C"
JNIEXPORT jint JNICALL
Java_com_example_semko_myapplication_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject asdf) {
    get13();
    return 1;
}

如果使用javah为您准备myapplication/jni/native-lib.h,它将具有

extern "C"
JNIEXPORT jint JNICALL
Java_com_example_semko_myapplication_MainActivity_stringFromJNI(
    JNIEnv* env,
    jobject asdf);

在cpp文件中,您将

#include "native-lib.h"
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libhello
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libhello.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := native-lib
LOCAL_SRC_FILES := native-lib.cpp
LOCAL_SHARED_LIBRARIES := libhello
include $(BUILD_SHARED_LIBRARY)
 类似资料:
  • 我正在尝试链接一个名为libtest lib的预编译共享库文件。所以这是我在CMakeLists的底部所拥有的。txt: 如上所述,我得到以下错误: 如果我注释掉add_library行,我会得到以下结果: 在库中链接时,似乎绝对需要源文件(.c、cpp等)。但我如何在一个。那档案呢?这些文档对target_link_库()做了如下介绍: 被命名的必须是由add_executable()或add_

  • #include <hiredis/hiredis.h> int main(void) { char a[1026] = {0}; redisContext *c = NULL; void *reply = NULL; memset(a, 'a', (sizeof(a) - 1)); c = redisConnec

  • 我想在Android系统中将大数据从一个进程/应用程序传输到另一个进程/应用程序,但在Java层使用内存文件创建共享内存的方法并不奏效。 然后尝试在android原生中创建共享内存,我在某处阅读了 ashmem_create_regionAPI可以使用。但看起来这个API无法访问或打开。它在libcutils.so. 这是在 Q1.如何在android本机代码中访问此库。 如果无法访问,那么在nd

  • 问题内容: 我正在尝试建立一个共享库。让我们说libabc.so。它使用另一个.so文件,例如lib123.so(/ usr / local / lib中的一个lib)。现在我在我的应用程序中使用共享的liblibabc.so。说我的应用程序。我想知道我应该如何链接这些二进制文件?我不想直接将我的应用程序与lib123.so链接。my- app应该仅与libabc.so链接。我怎样才能做到这一点?

  • 问题内容: 我正在尝试使用集成使用我的应用程序编写的第三方库。我已经为测试编写了所有的python代码。我很难找到设置此示例的方法。 我有一个手动创建的文件。第三方给了我a和a 。据我所知,没有其他依赖项。有人可以提供使用和进行设置的示例吗? 谢谢 问题答案: 当然可以! (在下文中,我假设你已经知道如何处理之间和交互和,如果这不是完全的情况下,只问我会开发部分以及) 示例(来自我的C ++项目,

  • 我试图通过URL(通过电子邮件等共享)启动我的原生应用程序。Android似乎只响应HTTP深度链接URL(例如。,http://myapp.com/stuff),并且iOS只响应非HTTP自定义深度链接URL(例如。,myapp://stuff).是否有人找到了一个解决方案,可以让两个操作系统打开同一个URL? 此外,iOS有可能使用HTTP深层链接URL吗?类似于http://youtu.be