如何通过Android NDK编译c ++项目

ant*_*mea 4 c++ mobile android

我有一个小类的C++库项目.

class Test
{
public:
Test(){};
~Test(){};
int SomeFunc() { return 5; }
}
Run Code Online (Sandbox Code Playgroud)

我可以通过Android NDK构建这个类.(问题1).我可以将.so文件用于Java应用程序.我如何从Java代码调用SomeFunc方法(问题2).

Wil*_*ann 9

以下是步骤:

1.)在项目的"jni"文件夹中创建Android.mk:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := main_jni
LOCAL_CFLAGS := 
LOCAL_SRC_FILES := main.cpp
LOCAL_LDLIBS :=

include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

2.)在"jni"文件夹中创建main.cpp:

#include <jni.h>
using namespace std;

#ifdef __cplusplus
extern "C" {
#endif

class Test {
public:
Test(){};
~Test(){};
int SomeFunc() { return 5; }
};

jint Java_com_example_activity_MainActivity_SomeFunc(JNIEnv *env, jobject thiz)
{
    Test *test = new Test();
    return test->SomeFunc();
}

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

3.)添加一个调用来加载调用活动中的库(本例中为MainActivity.java):

static {
    System.loadLibrary("main_jni");
}
Run Code Online (Sandbox Code Playgroud)

4.)在调用活动中定义本机函数:

native int SomeFunc();
Run Code Online (Sandbox Code Playgroud)

5.)从活动中调用它:

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

    TextView text = (TextView) this.findViewById(R.id.text);

    text.setText(String.valueOf(SomeFunc()));
}
Run Code Online (Sandbox Code Playgroud)

6.)从项目的根文件夹运行"ndk-build"命令(注意:在此步骤之后刷新Eclipse中的项目)

7.)重新构建并运行应用程序