2012-11-30 42 views
4

我有一個類的小型C++庫項目。 如何通過Android NDK編譯C++項目

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

我可以建立使用Android NDK這一類。 (問題1)。 我可以使用.so文件導入到Java應用程序中。我如何從Java代碼調用SomeFunc方法(問題2)。

回答

0

我不確定我是否正確地理解了這些問題,但this link could be useful to you. 除了非常基本的知識外,我個人對C的瞭解不多,但我期待用NDK獲得更多的C。

0

無論你的代碼在C寫的,你需要定義它像java_urpackagename_class_methodname然後使用此代碼ü需要首先創建Java類中的本地方法一樣公共本土INT ABC()之前;告訴你,你要使用這種方法。要使用它,根據需要創建一個Android.mk或Application.mk。 .so將幫助你的java類知道你的c代碼想要做什麼。

8

步驟如下:

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建造」 命令從項目的根文件夾(注意:刷新此步驟後在Eclipse項目)

7)重新構建和運行應用程序

+0

'NDK-build'沒有按」在cpp代碼中選擇編譯器錯誤。 –