Java 从C+调用C函数+;Android JNI/NDK代码中的函数

Java 从C+调用C函数+;Android JNI/NDK代码中的函数,java,android,c++,c,android-ndk,Java,Android,C++,C,Android Ndk,我试图从NDKTest.c文件调用stringFromJNI2(env,obj)函数 以下是NDKTest.c文件的代码: #include <string.h> #include <stdio.h> #include <jni.h> #include <limits.h> JNIEXPORT jstring JNICALL Java_com_test_ndk_NDKTest_stringFromJNI2( JNIEnv *env,

我试图从NDKTest.c文件调用stringFromJNI2(env,obj)函数

以下是NDKTest.c文件的代码:

#include <string.h>

#include <stdio.h>
#include <jni.h>
#include <limits.h>

JNIEXPORT jstring JNICALL
Java_com_test_ndk_NDKTest_stringFromJNI2( JNIEnv *env,
                                              jobject thiz )
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
  #if defined(__ARM_PCS_VFP)
    #define ABI "armeabi-v7a/NEON (hard-float)"
  #else
    #define ABI "armeabi-v7a/NEON"
  #endif
#else
  #if defined(__ARM_PCS_VFP)
    #define ABI "armeabi-v7a (hard-float)"
  #else
    #define ABI "armeabi-v7a"
  #endif
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#elif defined(__x86_64__)
#define ABI "x86_64"
#elif defined(__mips64)  /* mips64el-* toolchain defines __mips__ too */
#define ABI "mips64"
#elif defined(__mips__)
#define ABI "mips"
#elif defined(__aarch64__)
#define ABI "arm64-v8a"
#else
#define ABI "unknown"
#endif

return (*env)->NewStringUTF(env, "Hello from JNI2 !  Compiled with ABI " ABI ".");

}
以下是CMakeLists.txt文件中的行:

cmake_minimum_required(VERSION 3.4.1)

add_library(testNDK SHARED
        TestNDK.cpp
        NDKTest.c)

# Include libraries needed for testNDK lib
target_link_libraries(testNDK
                  android
                  log)
以下是build.gradle文件中的代码:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion '25.0.2'
    defaultConfig {
        applicationId 'com.test.ndk'
        minSdkVersion 23
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        externalNativeBuild {
            cmake {
                arguments '-DANDROID_TOOLCHAIN=clang'
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }
    productFlavors {
        arm7 {
            // in the future, ndk.abiFilter might also work
            ndk {
                abiFilter 'armeabi-v7a'
            }
        }
        arm8 {
            ndk {
                abiFilters 'arm64-v8a'
            }
        }
        arm {
            ndk {
                abiFilter 'armeabi'
            }
        }
        x86 {
            ndk {
                abiFilter 'x86'
            }
        }
        x86_64 {
            ndk {
                abiFilter 'x86_64'
            }
        }
        mips {
            ndk {
                abiFilters 'mips', 'mips64'
            }
        }
        universal {
            ndk {
                abiFilters 'mips', 'mips64', 'x86', 'x86_64'
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:25.2.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.1'
}

我现在得到以下错误:“错误:(10, 1)错误:C++需要一个类型声明器用于所有声明”和“错误:(29, 23)错误:调用StrugFuffJNI2”是不明确的“由于TestNdk.CPP:

中的以下代码行”
stringFromJNI2(JNIEnv *env, jobject obj);
中的这行代码位于代码的外部“C”块中。我试图从TestNDK.cpp文件调用NDKTest.c文件中的stringFromJni2()函数。如何修复当前出现的错误,并在NDKTest.c文件中调用stringFromJNI2()函数以显示“Hello from JNI2!Compiled with ABI”字符串。在此方面的任何帮助都将不胜感激。谢谢

我试图从TestNDK.cpp文件调用NDKTest.c文件中的stringFromJni2()函数

您应该在
NDKTest.h
中从
NDKTest.c
声明函数原型。因此,标题应如下所示:

\ifndef NDKTEST\u H_
#定义NDKTEST_H_
#包括
#ifdef_uucplusplus
外部“C”{
#恩迪夫
JNI2(JNIEnv*env,jobject thiz)中的jstring Java_com_test_ndk_NDKTest_string;
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫
TestNDK.cpp

#包括
#包括“NDKTest.h”
#ifdef_uucplusplus
外部“C”{
#恩迪夫
//删除此声明
//stringFromJNI2(JNIEnv*env,jobject对象);
JNIEXPORT jstring JNICALL
Java_com_test_ndk_TestNDK_main(JNIEnv*env,jobject obj){
#如果已定义(\uuuuu臂\uuuuuuuu)
#如果已定义(_臂_拱_7A__)
#如果已定义(\uuuu手臂\uuu霓虹灯)
#定义ABI“armeabi-v7a/NEON”
#否则
#定义ABI“armeabi-v7a”
#恩迪夫
#否则
#定义ABI“armeabi”
#恩迪夫
#定义的elif(uuuuu386_uuuuuuu)
#定义ABI“x86”
#恩迪夫
从JNI2(env,obj)返回Java\u com\u test\u ndk\u NDKTest\u字符串;
}
#ifdef_uucplusplus
}
#恩迪夫
TestNDK.java

//库名称必须相同
//正如您在CMakeLists.txt中定义的
静止的{
加载库(“testNDK”);
}
cmake_minimum_required(VERSION 3.4.1)

add_library(testNDK SHARED
        TestNDK.cpp
        NDKTest.c)

# Include libraries needed for testNDK lib
target_link_libraries(testNDK
                  android
                  log)
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion '25.0.2'
    defaultConfig {
        applicationId 'com.test.ndk'
        minSdkVersion 23
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        externalNativeBuild {
            cmake {
                arguments '-DANDROID_TOOLCHAIN=clang'
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }
    productFlavors {
        arm7 {
            // in the future, ndk.abiFilter might also work
            ndk {
                abiFilter 'armeabi-v7a'
            }
        }
        arm8 {
            ndk {
                abiFilters 'arm64-v8a'
            }
        }
        arm {
            ndk {
                abiFilter 'armeabi'
            }
        }
        x86 {
            ndk {
                abiFilter 'x86'
            }
        }
        x86_64 {
            ndk {
                abiFilter 'x86_64'
            }
        }
        mips {
            ndk {
                abiFilters 'mips', 'mips64'
            }
        }
        universal {
            ndk {
                abiFilters 'mips', 'mips64', 'x86', 'x86_64'
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:25.2.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.1'
}
stringFromJNI2(JNIEnv *env, jobject obj);