Android NDK的简单例子

来源:互联网 发布:日本旅游花费 知乎 编辑:程序博客网 时间:2024/05/01 07:37

PS:我使用的是NDK r-10b,r7版本以上都是不用cygwin的

一、

新建Android工程,在工程上右键点击Android Tools->Add Native Support...->finish

工程就会多一个jni的文件夹,jni下有Android.mk和cpp文件。Android.mk是NDK工程的Makefile,cpp就是NDK的源文件。

二、

新建一个类,并用native申明两个函数:

package com.example.ndktest;public class JniClient {    static public native String AddStr(String strA, String strB);    static public native int AddInt(int a, int b);}

用命令行工具cd到工程目录下/bin/classes 

输入javah com.example.ndktest.JniClient

这里的com.example.ndktest是包名,后面是类名,于是在目录下会生成com_example_ndktest_JniClient.h头文件,再把这个头文件复制到工程的jni文件下。


三、在cpp文件里实现

//#include <jni.h>#include <com_example_ndktest_JniClient.h>#include <stdlib.h>#include <stdio.h>JNIEXPORT jstring JNICALL Java_com_example_ndktest_JniClient_AddStr  (JNIEnv *env, jclass arg, jstring instringA, jstring instringB){jstring str=env->NewStringUTF("HelloWorld from JNI !");   // jstring str = (*env)->NewStringUTF(env, "HelloWorld from JNI !");    return str;}JNIEXPORT jint JNICALL Java_com_example_ndktest_JniClient_AddInt(JNIEnv *, jclass, jint a, jint b){return (a + b);}

PS:这里需要注意,名字必须和头文件严格对齐,否则会出现许多错误。(因为我之前看网上教程直接复制忽略了包名和类名,绕了很多弯路)


四、MainActivity文件

public class MainActivity extends Activity {static {System.loadLibrary("NDKTest");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);          int iSum = JniClient.AddInt(5, 7);                String strSum = "5 + 7 = " + iSum;        String str = JniClient.AddStr("test", "test");        TextView tv1 = new TextView(this);        tv1.setText(strSum);        setContentView(tv1);}

想实现不同的功能只用选择“str”或者“strSum”即可





1 0
原创粉丝点击