软件版本的选择:
1、ADT-Bundle:adt-bundle-windows-x86_64-20131030
理由:这个版本自带Native Developer
Tools支持,是否支持看Preferences,有NDK项就是支持了。可以安装插件,这里略过,选择集成了最简单。
adt-bundle-windows-x86_64-20140702这个版本不支持
2、NDK版本:android-ndk-r10e-windows-x86.exe
这个还不是64位的,应该没有问题
3、创建工程testNDK,因此包名写成了cn.maxma.testndk,都是小写的
里面就一个类MainActivity,派生自Activity。
4、主要代码如下:
public class MainActivity extends Activity {
private TextView tv;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//
tv =
(TextView) findViewById(R.id.textView1);
btn =
(Button) findViewById(R.id.button1);
}
// android:onClick="clickMe"
public void clickMe(View view){
double randowmDouble= Math.random();
long x=Math.round(randowmDouble*100);
randowmDouble = Math.random();
long y=Math.round(randowmDouble*100);
System.loadLibrary("testNDK");
long z = add(x, y);
String
msg=x+" +
"+y+" =
"+z;
tv.setText(msg);
}
public native long add(long x,long y);
}
上面的
System.loadLibrary("testNDK");
没有加static作为静态代码块。
5、在项目根目录创建jni目录
6、给项目添加Native Support
项目右键/Android Tools/Add Native Support
会弹出框,设置编译生成的共享库文件*.so 的文件名
Library Name:lib***.so
上面的***是供输入的名称,默认就是项目名,即:testNDK,这样最后产生的库文件名称为libtestNDK.so,存放在lib目录下面对应的CPU下面。
上面的对话框确认之后,会自动在上一步的jni目录中生成两个文件:
testNDK.cpp
Android.mk
7、上面的testNDK.cpp文件就一行
#include
剩下来的是要写代码去实现安卓中的那个声明过的native方法add
8、Android.mk文件已经帮我们写好了:
LOCAL_PATH :=$(call my-dir)
Include $(CLEAR_VARS)
LOCAL_MODULE :=testNDK
LOCAL_SRC_FILES :=testNDK.cpp
Include $(BUILD_SHARED_LIBRARY)
这个代完全不必去改动它,暂时也可以不必理会里面的具体含义。
9、编写C语言的函数体
JNIEXPORT jlong JNICALL
Java_cn_maxma_testndk_MainActivity_add(
JNIEnv * env,jclass thiz,jlong x,jlong y)
{
return x+y;
}
注意:上面的jclass的参数改成了thiz是因为this是关键字
10、增加C/C++搜索路径
项目属性->C/C++ General->Paths and Symbols->Add
添加NDK中的目录
确认之后,上面的程序代码下的错误指示波浪线消失。
11、为项目添加新的Builder
项目属性->Builders->New->Program:
【Refresh】接着切换到Refresh选项卡:勾选Recursively include
sub-folders,即递归进所有的子目录。
【Build Options】接着切换到Build Options,勾选最后一个选项,然后点击“Specify
Resources…”,选择项目中的jni目录。
13、保存上面的程序,eclipse会自动调用ndk进行编译,结果:
[armeabi] Compile++ thumb: testNDK <= testNDK.cpp
[armeabi] StaticLibrary : libstdc++.a
[armeabi] SharedLibrary :
libtestNDK.so
[armeabi] Install
: libtestNDK.so =>
libs/armeabi/libtestNDK.so
上面最后一句的意思是生成了*.so文件,并且存放到libs/armeabi/目录中了。
如果NDK的版本更高些的话,比如R12e,会编译出多个so文件,最后的行数会大大增加:
[x86] install :libtestNDK.so =>
libs/x86/libtestNDK.so
[mips] install :libtestNDK.so =>
libs/mips/libtestNDK.so
14、各种错误现象
W: No implementation found for native
Lcn/maxma/testndk/MainActivity;.add:(JJ)J
E: FATAL EXCEPTION: main
E: java.lang.IllegalStateException: Could not execute method
of the activity