一、生成动态库so的方法有两种
1.在Android源码环境中生成so
(1)App由两部分组成:Native实现程序+应用程序+引用静态库,将实现程序拷贝至源码项目,编写Android.mk。
(2)把需要引用的外部静态库拷贝至源码目录
(3)执行mm后,生成动态库 Install: out/target/product/generic/system/lib/libNetStartRecord.so
2.利用NDK生成so
(1)配置NDK环境,下载android-ndk-r5b,设置PATH环境变量。
(2)在elipse里新建Android项目,在项目内新建jni文件夹,并在文件夹中添加Nactive Code文件和Android.mk文件。
(3)使用终端进入改项目,执行$NDK/ndk-build命令,在项目位置生成obj和libs文件夹。so库文件在libs文件夹里生成了。
二、解决NDK r5b引用静态库失效的问题
如果这个外部的静态库.a不是由NDK生成,那在Android.mk里面,就应该用LOCAL_LDLIBS
来引用该静态库。如下:
LOCAL_LDLIBS := libvoiceengine.a
三、在NDK的Nactive代码中使用Android Log的方法
1.在mk文件加入:LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
2.在cpp文件加入:
#include <android/log.h>
#define LOGI(...) __android_log_print(ANDROID_LOG_DEBUG, "keymatch", __VA_ARGS__)
3.使用:LOGI("input params Challenge");
四、生成Native java头文件
(1)声明Java Native接口。(定义Java Native接口可以在Android项目的主类里声明,也可以通过使用独立的类来声明。)
static { System.loadLibrary("libtmpcPlayerDemo"); } public native void start_netiq()
- package
com.enleo.tmpcPlayer4Droid; -
- import
android.app.Activity; - import
android.os.Bundle; - import
android.view.View; - import
android.view.View.OnClickListener; - import
android.widget.Button; -
- public
class tmpcPlayer4Droid extends Activity implements OnClickListener { -
private final static String TAG = "tmpcPlayer4Droid"; -
-
// native java -
private Button startNetIQBtn; -
static -
{ -
System.loadLibrary("libtmpcPlayerDemo"); -
} -
public native void start_netiq(); -
-
-
@Override -
public void onCreate(Bundle savedInstanceState) { -
super.onCreate(savedInstanceState); -
setContentView(R.layout.main); -
startNetIQBtn = (Button)findViewById(R.id.startNetIQ); -
startNetIQBtn.setOnClickListener(this); -
} -
public void onClick(View arg0) { -
// TODO Auto-generated method stub -
switch (arg0.getId()) { -
case R.id.startNetIQ: -
start_netiq(); -
break; -
default: -
break; -
} -
} -
- }
javah -classpath . -jni com.enleo.tmpcPlayer4Droid.tmpcPlayer4Droid