You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NDK+C++开发遭遇no implementation found错误,求专业解答

Troubleshooting JNI Undefined Reference Error

Hey there, let's tackle this JNI linking error you're facing—this is a super common pitfall in Android JNI development, so let's break down the problem using the files you shared:

First, Let's Recap the Key File Content

1. Header File: com_BTC_ui_JNI.h

This looks like the auto-generated header from javah, which follows the correct JNI structure:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_BTC_ui_JNI */

#ifndef _Included_com_BTC_ui_JNI
#define _Included_com_BTC_ui_JNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_BTC_ui_JNI
 * Method:    addComputer
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_BTC_ui_JNI_addComputer
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

2. Implementation File: addcomputer.cpp

Your function logic is simple, but we'll check a critical detail here later:

#include "com_BTC_ui_JNI.h"

JNIEXPORT jint JNICALL Java_com_BTC_ui_JNI_addComputer(JNIEnv *env, jobject obj, jint a, jint b) {
    return a + b;
}

3. Android.mk Configuration

Your build script targets the right file on surface, but let's verify:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := addcomputer
LOCAL_SRC_FILES := addcomputer.cpp

include $(BUILD_SHARED_LIBRARY)

4. Java Calling Code

Your native method declaration and library loading look correct:

package com.BTC.ui;

public class JNI {
    static {
        System.loadLibrary("addcomputer");
    }

    public native int addComputer(int a, int b);
}

// Usage example elsewhere
JNI jniInstance = new JNI();
int result = jniInstance.addComputer(1, 2);

Why You're Seeing the "Undefined Reference" Error

This error means the linker can't find the implementation of Java_com_BTC_ui_JNI_addComputer when building the shared library. The most likely culprits are:

  1. C++ Name Mangling: C++ modifies function names under the hood, but JNI expects a strict C-style function name that matches the header exactly.
  2. Build Cache or Inclusion Issues: The Android.mk might not be compiling your .cpp file properly, or old build artifacts are causing conflicts.
  3. Signature Mismatch: A tiny typo in the function name, parameters, or package path between the Java class and JNI code.

Fixes to Try (In Order)

1. Ensure extern "C" Wraps Your JNI Function

Even though your header has extern "C", sometimes the C++ compiler still mangles the function name if the implementation isn't explicitly wrapped. Update your addcomputer.cpp to:

#include "com_BTC_ui_JNI.h"

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jint JNICALL Java_com_BTC_ui_JNI_addComputer(JNIEnv *env, jobject obj, jint a, jint b) {
    return a + b;
}

#ifdef __cplusplus
}
#endif

This forces the compiler to use C-style naming for the JNI function, which matches what the linker expects.

2. Clean and Rebuild to Fix Cache Issues

Old build artifacts often cause weird linking problems. Run these commands from your project root:

./gradlew clean
./gradlew assembleDebug

This wipes stale builds and ensures your .cpp file is compiled and linked correctly.

3. Verify the JNI Function Signature Matches Exactly

Typos are easy to miss! Use the javah tool to regenerate the header file and compare it to your current one:

  1. Navigate to your compiled Java classes directory (usually app/build/intermediates/javac/debug/classes)
  2. Run:
javah -jni com.BTC.ui.JNI

Compare the generated header to your existing com_BTC_ui_JNI.h—make sure the function name, parameters, and return type are identical (case-sensitive!)

4. Double-Check Android.mk Paths

If your addcomputer.cpp is in a subdirectory (not the same folder as Android.mk), update LOCAL_SRC_FILES to include the relative path, e.g.:

LOCAL_SRC_FILES := src/addcomputer.cpp

Quick Additional Checks

  • Confirm your Java class is indeed in the com.BTC.ui package—package names are case-sensitive in JNI!
  • Check that the shared library is being generated: Look in app/build/outputs/native-debug/lib/[your-abi]/ for libaddcomputer.so
  • If you're using CMake instead of Android.mk (some projects switch), make sure your CMakeLists.txt includes addcomputer.cpp in the add_library block

内容的提问来源于stack exchange,提问作者Eilir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:05:44