Java 从C+调用C函数+;Android JNI/NDK代码中的函数
我试图从NDKTest.c文件调用stringFromJNI2(env,obj)函数 以下是NDKTest.c文件的代码: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,
#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);