4

I have small C++ library project with one class.

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

I can build this class via Android NDK. (Question 1). I can use .so file into Java application. How I can call SomeFunc method from Java code (Question 2).

4

3 回答 3

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)

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

3.) 添加调用以在调用活动中加载库(本例中为 MainActivity.java):

static {
    System.loadLibrary("main_jni");
}

4.) 在调用活动中定义原生函数:

native int SomeFunc();

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()));
}

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

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

于 2012-12-01T01:01:28.257 回答
0

我不确定我是否正确理解了这些问题,但此链接可能对您有用。 除了非常基础的知识外,我个人对 C 的了解不多,但我期待通过 NDK 获得更多的 C。

于 2012-11-30T23:49:20.480 回答
0

无论您在 c 中编写什么代码,都需要像java_urpackagename_class_methodname一样定义它,然后在使用此代码之前,您需要首先在 java 类中创建一个本地方法,例如public native int ABC(); 告诉它您将使用此方法。要使用它,请根据您的需要创建一个 Android.mk 或 Application.mk。.so 将帮助您的 java 类知道您的 c 代码想要做什么。

于 2012-12-01T00:23:35.353 回答