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