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");
}
@Override
protected 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”即可