前提条件:ndk安装(我用的是10e)及环境变量配置,具体操作可参考网上其他教程。
开发流程
1.新建android项目
2.添加native方法
public class MainActivity extends Activity {
public static native String getStringFromC();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
3.用javah(属于jdk命令)生成jni目录及头文件(.h文件)
打开cmd,进入工程目录,我的工程目录为:E:\lipeng-bj\android_dev_sf\ws\HWNDK,输入javah -help可查看javah相关的参数,输入命令生成jni目录:javah -classpath bin\classes -d jni -jni com.lp.hwndk.MainActivity,但此时会报错误如下:
错误:无法访问android.app.Activity
找不到android.app.Activity的类文件
解决办法:javah -classpath bin\classes**;<个人SDK目录>\sdk\platforms\android-19\android.jar** -d jni -jni com.lp.hwndk.MainActivity
我的如下:javah -classpath bin\classes;E:\lipeng-bj\android_dev_sf\sdk\platforms\android-19\android.jar -d jni -jni com.lp.hwndk.MainActivity
具体如下图所示:
成功后刷新工程,会生成jni目录及.h文件
4.编写.c文件
创建一个.c文件,名称自定义,同时将生成的.h文件中的方法:JNIEXPORT jstring JNICALL Java_com_lp_hwndk_MainActivity_getStringFromC
(JNIEnv *, jclass)复制到刚创建的.c文件中,去掉JNIEXPORT 及JNICALL ,如下:
关于日志部分需要在Android.mk文件中加入依赖的库,一会下图有指出
5.右击工程,Android Tools->Add Native Support,填入要生成的so文件的名称,会自动生成Android.mk文件,如下图所示,不过我增加了打印日志依赖的库。有一点我需要特别声明:通过Add Native Support 生成的Android.mk文件中的是LOCAL_SRC_FILES:=hellondk.cpp,因为我是在.c文件中写的方法,所以这里也应该改成c文件!!!!!!!
6.右击工程,Clean Project 并且 Build Project 并且 Close Project,最后打开工程项目Open Project。此时应该不会出现错误,但是当你点击.c文件时会发现竟然报错了,主要是Method could not be resolved 的错误,如下图所示:
7.错误问题的解决办法
主要参考了https://stackoverflow.com/questions/23155676/android-ndk-build-method-could-not-be-resolved/23158929#23158929该文章的解决办法。我这里再做一下说明
配置如下图:
需要Clean Project 并且 Build Project 并且 Close Project,最后打开工程项目Open Project
可发现还是有错误!!!怎么办???,如下图:
提示的是gcc找不到》》???,去解决一下。。。
需要Clean Project 并且 Build Project 并且 Close Project,最后打开工程项目Open Project
应该不报错了!并且有代码提示了。
MainActivity类如下进行so调用
public class MainActivity extends Activity {
static{
System.loadLibrary("hellondk");
}
public static native String getStringFromC();
private TextView text1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text1 = (TextView) findViewById(R.id.text1);
text1.setText(getStringFromC());
}
}