您的位置:首页 > 移动开发 > Android开发

android ndk 开发流程以及“Method could not be resolved”的解决办法,代码提示

2015-07-31 10:00 447 查看
前提条件: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());

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息