Android EclipseNDK构建错误';添加';未在此范围中声明

Android EclipseNDK构建错误';添加';未在此范围中声明,android,android-ndk,Android,Android Ndk,我是NDK和JNI新手,不知道如何修复这个错误。我手动将libMathFuncLib.so、mathFuncsLibs.cpp和MathFuncLibs.h文件复制到Eclipse项目中。当我运行此命令“ndk build”并返回“workspace/test/jni/TestMath.cpp:error:“Add”未在此范围内声明 以下是我的文件夹结构: -test |__src |__ExecuteTest.java |__MainActivity.java

我是NDK和JNI新手,不知道如何修复这个错误。我手动将libMathFuncLib.so、mathFuncsLibs.cpp和MathFuncLibs.h文件复制到Eclipse项目中。当我运行此命令“ndk build”并返回“workspace/test/jni/TestMath.cpp:error:“Add”未在此范围内声明

以下是我的文件夹结构:

-test
   |__src
       |__ExecuteTest.java
       |__MainActivity.java

   |__jni
       |__Android.mk
       |__Application.mk
       |__TestMath.cpp

   |__libs
       |__armeabi

   |__myLibs
       |__armeabi
           |__libMathFuncLib.so

   |__myNatives
       |__MathFuncLibs.cpp
       |__MathFuncLib.h
以下是MathFuncLib.h文件:

//This is static library example    

#ifndef MathFuncLib_INCLUDED
#define MathFuncLib_INCLUDED

#ifdef __cplusplus
extern "C" {
#endif   

    class MyMathFunc
    {

    public:

        static int Add(int a, int b);  
        static int Subtract(int a, int b);
        static int Multiply(int a, int b);
        static double Divide(int a, int b);

    };

#ifdef __cplusplus
} // extern "C"
#endif
#endif
以下是MathFuncLib.cpp文件:

#include "MathFuncLib.h"

    int MyMathFunc::Add(int a, int b)
    {
        return a + b;
    }

    int MyMathFunc::Subtract(int a, int b)
    {
        return a - b;
    }

    int MyMathFunc::Multiply(int a, int b)
    {
        return a * b;
    }

    double MyMathFunc::Divide(int a, int b)
    {
        return a / b;
    }
#include <jni.h>
#include <string.h>
#include <android/log.h>
#include "../myNatives/MathFuncLib.h"

extern "C"
{

    JNIEXPORT int  JNICALL Java_com_example_test_ExecuteTest_TestAdd(JNIEnv *env, jobject obj)
    {
        __android_log_print(ANDROID_LOG_INFO, "Test", "Inside TestAdd()");

        int retVal= Add(50,50);//Add(,) is a method inside MathFuncLib.so file
        return retVal;
    }
}
以下是MainActivity.java文件:

package com.example.test;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;//to use TextView
import android.widget.GridLayout.LayoutParams;//to use LayoutParams

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);       

        int retVal = 0;
        ExecuteTest et = new ExecuteTest();
        retVal = et.TestAdd();            

        TextView tv = new TextView(this);
        LayoutParams lp = new LayoutParams();
        lp.setMargins(150, 50, 200, 0);
        tv.setLayoutParams(lp);
        tv.setText(String.valueOf(retVal));
        setContentView(tv);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
package com.example.test;

import android.util.Log;

public class ExecuteTest {

    public int ReturnValue(){
        return 50;
    }

    public native int TestAdd();

    static
    {
        System.loadLibrary("MathFuncLib");
        System.loadLibrary("Arithmetic");

        Log.i ("ExecuteTest", "Shared Libs loaded");
    }       
}
以下是ExecuteTest.java文件:

package com.example.test;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;//to use TextView
import android.widget.GridLayout.LayoutParams;//to use LayoutParams

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);       

        int retVal = 0;
        ExecuteTest et = new ExecuteTest();
        retVal = et.TestAdd();            

        TextView tv = new TextView(this);
        LayoutParams lp = new LayoutParams();
        lp.setMargins(150, 50, 200, 0);
        tv.setLayoutParams(lp);
        tv.setText(String.valueOf(retVal));
        setContentView(tv);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
package com.example.test;

import android.util.Log;

public class ExecuteTest {

    public int ReturnValue(){
        return 50;
    }

    public native int TestAdd();

    static
    {
        System.loadLibrary("MathFuncLib");
        System.loadLibrary("Arithmetic");

        Log.i ("ExecuteTest", "Shared Libs loaded");
    }       
}
以下是TestMath.cpp文件:

#include "MathFuncLib.h"

    int MyMathFunc::Add(int a, int b)
    {
        return a + b;
    }

    int MyMathFunc::Subtract(int a, int b)
    {
        return a - b;
    }

    int MyMathFunc::Multiply(int a, int b)
    {
        return a * b;
    }

    double MyMathFunc::Divide(int a, int b)
    {
        return a / b;
    }
#include <jni.h>
#include <string.h>
#include <android/log.h>
#include "../myNatives/MathFuncLib.h"

extern "C"
{

    JNIEXPORT int  JNICALL Java_com_example_test_ExecuteTest_TestAdd(JNIEnv *env, jobject obj)
    {
        __android_log_print(ANDROID_LOG_INFO, "Test", "Inside TestAdd()");

        int retVal= Add(50,50);//Add(,) is a method inside MathFuncLib.so file
        return retVal;
    }
}
下面是Application.mk文件:

APP_STL := gnustl_shared
APP_STL := gnustl_shared

谢谢。

这是正确的表格

Application.mk

APP_ABI         := x86              ## -- set to whatever platform you need
APP_PLATFORM    := android-9
APP_STL         := stlport_static   ## -- USE IT

至于Android.mk,您需要2个,因为我看到您希望使用两个项目构建一个解决方案--

本机(非JNI)库

第二个本机(JNI)库,它加载第一个本机库,并通过JNI将其提供给JAVA

Application.mk应该是重复的

Android.mk(本机部分)

您将使用Eclipse,因此您可以在\u path\u to\uu myNatives/obj/local/$(TARGET\u ARCH\u ABI)/libMathFunc.a中找到输出$(TARGET_ARCH_ABI)在本例中的计算结果为x86。 需要为您的平台构建一次(在Application.mk中指定)

Android.mk(本机JNI的部分)

将“静态”替换为“共享”(无引用ofc)


这是正确的表格

Application.mk

APP_ABI         := x86              ## -- set to whatever platform you need
APP_PLATFORM    := android-9
APP_STL         := stlport_static   ## -- USE IT

至于Android.mk,您需要2个,因为我看到您希望使用两个项目构建一个解决方案--

本机(非JNI)库

第二个本机(JNI)库,它加载第一个本机库,并通过JNI将其提供给JAVA

Application.mk应该是重复的

Android.mk(本机部分)

您将使用Eclipse,因此您可以在\u path\u to\uu myNatives/obj/local/$(TARGET\u ARCH\u ABI)/libMathFunc.a中找到输出$(TARGET_ARCH_ABI)在本例中的计算结果为x86。 需要为您的平台构建一次(在Application.mk中指定)

Android.mk(本机JNI的部分)

将“静态”替换为“共享”(无引用ofc)


只想分享我的固定电话

1) 在MyMathFunc.h文件中,我不应该使用“extern C”,因为C不支持类。如果想要使用“externC”,那么我必须删除类声明

2) 需要更改Android.mk和Application.mk文件

Android.mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := MathFuncLib-prebuilt
LOCAL_SRC_FILES := ../myLibs/armeabi/libMathFuncLib.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := Arithmetic
LOCAL_SRC_FILES := TestMath.cpp
LOCAL_LDLIBS := -llog -lz

include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)    
include $(CLEAR_VARS) 

LOCAL_MODULE := MathFuncLib
LOCAL_SRC_FILES := ../myLibs/armeabi/libMathFuncLib.so
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS)    
LOCAL_SHARED_LIBRARIES := MathFuncLib    
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../myNatives/    
LOCAL_MODULE := Arithmetic
LOCAL_SRC_FILES := TestMath.cpp    
LOCAL_LDLIBS := -llog -lz   

#Tell it to build an APK    
include $(BUILD_SHARED_LIBRARY)
Application.mk文件:

APP_STL := gnustl_shared
APP_STL := gnustl_shared

只想分享我的固定电话

1) 在MyMathFunc.h文件中,我不应该使用“extern C”,因为C不支持类。如果想要使用“externC”,那么我必须删除类声明

2) 需要更改Android.mk和Application.mk文件

Android.mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := MathFuncLib-prebuilt
LOCAL_SRC_FILES := ../myLibs/armeabi/libMathFuncLib.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := Arithmetic
LOCAL_SRC_FILES := TestMath.cpp
LOCAL_LDLIBS := -llog -lz

include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)    
include $(CLEAR_VARS) 

LOCAL_MODULE := MathFuncLib
LOCAL_SRC_FILES := ../myLibs/armeabi/libMathFuncLib.so
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS)    
LOCAL_SHARED_LIBRARIES := MathFuncLib    
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../myNatives/    
LOCAL_MODULE := Arithmetic
LOCAL_SRC_FILES := TestMath.cpp    
LOCAL_LDLIBS := -llog -lz   

#Tell it to build an APK    
include $(BUILD_SHARED_LIBRARY)
Application.mk文件:

APP_STL := gnustl_shared
APP_STL := gnustl_shared

对不起,误会了。我不想为两个项目构建解决方案。我只想让java调用C++中的数学(int,int),所以我把那个C++库建成共享库,并把它复制到Eclipse项目文件夹MyProTeNe。我之所以将MathFuncLib.cpp复制到myNatives文件夹中,是因为我不确定,所以还是照做了。对于我理解的,我需要JNI部分调用java函数C++(int,int)。基本上就是这样。我想你误解了我的答案。如果您不想要两个库,只需将源代码包含在第二个Android.mk文件中,并删除“---dependent Static libraries Linkage---”部分,抱歉误解。我不想为两个项目构建解决方案。我只想让java调用C++中的数学(int,int),所以我把那个C++库建成共享库,并把它复制到Eclipse项目文件夹MyProTeNe。我之所以将MathFuncLib.cpp复制到myNatives文件夹中,是因为我不确定,所以还是照做了。对于我理解的,我需要JNI部分调用java函数C++(int,int)。基本上就是这样。我想你误解了我的答案。如果您不需要2个库,只需将源代码包含在第二个Android.mk文件中,并删除“---dependent Static libraries Linkage---”部分