2017-04-10 21 views
1

NDKTest.cファイルからstringFromJNI2(env、obj)関数を呼び出そうとしています。ここでAndroid関数のC++関数からC関数を呼び出すJNI/NDKコード

は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 "."); 

} 

はNDKTest.hファイルのコードです:ここで

#ifndef NDKTEST_H_ 
#define NDKTEST_H_ 

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

const std::allocator<char> & stringFromJNI2(JNIEnv *env, jobject thiz); 

#endif 

はTestNDK.cppファイルのコードです:ここでは

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

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

#include "NDKTest.h" 

extern "C" { 
    stringFromJNI2(JNIEnv *env, jobject obj); 
} 

JNIEXPORT jstring JNICALL 
Java_com_test_ndk_TestNDK_main(JNIEnv *env, jobject obj) { 
#if defined(__arm__) 
#if defined(__ARM_ARCH_7A__) 
#if defined(__ARM_NEON__) 
#define ABI "armeabi-v7a/NEON" 
#else 
#define ABI "armeabi-v7a" 
#endif 
#else 
#define ABI "armeabi" 
#endif 
#elif defined(__i386__) 
#define ABI "x86" 
#endif 
    //std::string hello("Hello from JNI ! Compiled with ABI " ABI "."); 
    std::string hello(stringFromJNI2(env, obj)); 
    return env->NewStringUTF(hello.c_str()); 
} 

はTestNDK.javaファイルのコードです:

ここでは10
package com.test.ndk; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class TestNDK extends AppCompatActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    /* Retrieve our TextView and set its content. 
    * the text is retrieved by calling a native 
    * function. 
    */ 
    setContentView(R.layout.activity_hello_jni); 
    TextView tv = (TextView)findViewById(R.id.hello_textview); 
    tv.setText(main()); 

    public native String main(); 

    static { 
     //System.loadLibrary("main"); 
     System.loadLibrary("TestNDK"); 
    } 
} 

ラインはCMakeLists.txtファイルにあります。私は現在、次のエラーを取得しています

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' 
} 

:ここ

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ファイルからコードです"エラー:(10、1)エラー:C++には、すべての宣言の型指定子が必要です"エラー:(29,23)エラー:TestNDK.cppの次のコード行のために 'stringFromJNI2'

stringFromJNI2(JNIEnv *env, jobject obj); 

コードのこの行は、コードのextern "C"ブロックにあります。私はTestNDK.cppファイルからNDKTest.cファイルのstringFromJni2()関数を呼び出そうとしています。どのように現在のエラーを修正し、NDKTest.cファイルのstringFromJNI2()関数を呼び出して、 "Hello from JNI2!Compiled with ABI"文字列を表示しますか?これに関する助けがあれば大いに感謝します。ありがとう。

答えて

3

I'm trying to call the stringFromJni2() function in the NDKTest.c file from the TestNDK.cpp file.

あなたはNDKTest.hNDKTest.cから関数のプロトタイプを宣言する必要があります。だから、ヘッダーは次のようになります。

#ifndef NDKTEST_H_ 
#define NDKTEST_H_ 

#include <jni.h> 

#ifdef __cplusplus 
extern "C" { 
#endif 

jstring Java_com_test_ndk_NDKTest_stringFromJNI2(JNIEnv *env, jobject thiz); 

#ifdef __cplusplus 
} 
#endif 

#endif 

TestNDK.cpp

#include <jni.h> 

#include "NDKTest.h" 

#ifdef __cplusplus 
extern "C" { 
#endif 

// remove this declaration 
// stringFromJNI2(JNIEnv *env, jobject obj); 

JNIEXPORT jstring JNICALL 
Java_com_test_ndk_TestNDK_main(JNIEnv *env, jobject obj) { 
#if defined(__arm__) 
#if defined(__ARM_ARCH_7A__) 
#if defined(__ARM_NEON__) 
#define ABI "armeabi-v7a/NEON" 
#else 
#define ABI "armeabi-v7a" 
#endif 
#else 
#define ABI "armeabi" 
#endif 
#elif defined(__i386__) 
#define ABI "x86" 
#endif 
    return Java_com_test_ndk_NDKTest_stringFromJNI2(env, obj); 
} 

#ifdef __cplusplus 
} 
#endif 

TestNDK.java

// the library name has to be the same 
// as you defined in CMakeLists.txt 
static { 
    System.loadLibrary("testNDK"); 
} 
関連する問題