2013年10月2日 星期三

Android NDK 開發教程四:TwoLibs示例

http://www.imobilebbs.com/wordpress/archives/2924

Android NDK 開發教程四:TwoLibs示例

隨Android NDK 提供的另外一個例子TwoLibs,其中有兩個庫,一個為動態庫,一個為靜態庫,最終供Android Application使用的動態庫使用靜態庫中的函數,如下圖所示:
其中在first.c 中定義了一個簡單的C函數

int first(int x, int y)
{
 return x+y;
}

second.c 調用這個函數

jint
Java_com_example_twolibs_TwoLibs_add( JNIEnv*  env,
 jobject  this,
 jint     x,
 jint     y )
{
 return first(x, y);
}

為了介紹動態庫調用靜態庫的方法,這個例子將兩個C文件編譯成兩個模塊,這是通過android.mk 來定義的。
LOCAL_PATH:= $(call my-dir)
# first lib, which will be built statically # include $(CLEAR_VARS)
LOCAL_MODULE    := libtwolib-first LOCAL_SRC_FILES := first.c
include $(BUILD_STATIC_LIBRARY)
# second lib, which will depend on and include the first one # include $(CLEAR_VARS)
LOCAL_MODULE    := libtwolib-second LOCAL_SRC_FILES := second.c
LOCAL_STATIC_LIBRARIES := libtwolib-first
include $(BUILD_SHARED_LIBRARY)
註:當然對於這個簡單的例子,大可不必編譯成兩個模塊。
在Android 應用中調用動態庫(Android應用只可以調用動態庫)
public class TwoLibs extends Activity
{
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
 super.onCreate(savedInstanceState);

 TextView  tv = new TextView(this);
 int       x  = 1000;
 int       y  = 42;

 // here, we dynamically load the library at runtime
 // before calling the native method.
 //
 System.loadLibrary("twolib-second");

 int  z = add(x, y);

 tv.setText( "The sum of " + x + " and " + y + " is " + z );
 setContentView(tv);
 }

 public native int add(int  x, int  y);
}

下面就可以使用ndk-build  ,編譯C代碼,然後再使用Eclipse編譯Java代碼,運行結果如下: