Android NDK开发

来源:互联网 发布:我的世界新手网络联机 编辑:程序博客网 时间:2024/05/28 01:35

安装好eclipse、ADT、NDK(r9以上)后,编写NDK的具体步骤:

1.新建一个Android project

file->new->project...->android->android application project,next。。。。。。


2.新建一个jni文件

工程,右键android tools->add native support...,给.so文件取名,完成后,工程中自动生成


myNdk.cpp文件中编写底层的代码,Android.mk文件中一般不需修改

3.myNdk.cpp

#include <jni.h>#include <string.h>extern "C" {JNIEXPORT jstring JNICALL Java_com_example_androidndk_JNI_getString(JNIEnv* env, jobject obj){    //返回一个字符串    return (env)->NewStringUTF("Hello NDK!");}}

JNI接口的命名规范是:Java_ + 调用该方法的包名(包名的点用_代替,即com_example_androidndk) + _ + 调用该接口的类名(即JNI) + _ + 方法名(即getString),对于实例方法,有两个参数是必要的,一个JNI的环境指针JNIEnv *,另一个是调用该方法的Java实例jobject,如果还需要传入参数,可在和两个参数后面接着加上去,例

JNIEXPORT jint JNICALL Java_com_example_androidndk_JNI_add(JNIEnv* env, jobject obj, jint a, jint b)
注:

这里加上extern“C”,是为了从C语言导出,避免错误出现如下错误

4.新建调用JNI

右键src下的包名(即将其和mainactivity同目录),new->class,输入名称JNI,即myNdk.cpp中调用该接口的类名(此二者名称应相同,但不一定要用JNI)

package com.example.androidndk;//此文件相当于函数声明public class JNI {    //获取字符串      public native String getString();      }
为什么要建这么一个文件,从个人理解上来说,你可以吧JNI.java看成class中的.h文件,把myNdk.cpp看成class中的.cpp文件,这样将来不管那个java文件调用相关的函数,都可以从JNI.java中调用

5.建立.so文件

只需build一下,eclipse就自动建立了.so文件


此时,可能会出现如下错误:Unable to launch cygpath. Is Cygwin on the path?

解决办法:

1)工程右键,点Properties->C/C++ Build的Building Settings中去掉Use default build command,然后输入${NDKROOT}/ndk-build.cmd


2)在C/C++ Build中点击Environment,点Add...添加环境变量NDKROOT,值为NDK的根目录


6.使用

在mainactivity.java中使用函数

package com.example.androidndk;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity {//使用静态代码块加载类库      static{          System.loadLibrary("myNdk");//一定要注意名称没有“lib"      }          @Override      public void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          Button btn1 = (Button)findViewById(R.id.show_btn);          //定义本地类          final JNI jni = new JNI();                  btn1.setOnClickListener(new View.OnClickListener(){          @Override            public void onClick(View v) {                  //显示从C代码中返回的字符串                  Toast.makeText(getApplicationContext(), jni.getString(), Toast.LENGTH_SHORT).show();              }        });              }  }
运行程序



0 0