开发android多年,近日处于兴趣,研究了一下NDK的东西,以下是一个简单的DEMO,希望对初学者能有一些帮助。
Java代码:
package com.ndk.helloworld;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView mTv;
private TextView mTvSomeBody;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTv = (TextView) findViewById(R.id.tv_main);
mTv.setText(getHelloWorldFromNdk());
mTvSomeBody = (TextView) findViewById(R.id.tv_somebody);
mTvSomeBody.setText(sayHelloWorld("Mr.right"));
}
// NDK中对对应的方法名
public native String getHelloWorldFromNdk();
// NDK中对对应的方法名
public native String sayHelloWorld(String somebody);
// 加载金泰库
static {
System.loadLibrary("helloworld");
}
}
JNI内的代码:
#include <jni.h>
#include <stdio.h>
#include <string.h>
//表示一下编码用C语言编译
extern "C" {
//获取HelloWorld
//Java_(下划线连接的包名)_类名_方法名
jstring Java_com_ndk_helloworld_MainActivity_getHelloWorldFromNdk(JNIEnv *env,
jobject obj) {
return env->NewStringUTF("NDK,Helloworld!");
}
//将jstring 转换成char*
char* jstringTostring(JNIEnv* env, jstring jstr) {
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
jmethodID mid = env->GetMethodID(clsstring, "getBytes",
"(Ljava/lang/String;)[B");
jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0) {
rtn = (char*) malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
}
//对某人说Hello
//Java_(下划线连接的包名)_类名_方法名
jstring Java_com_ndk_helloworld_MainActivity_sayHelloWorld(JNIEnv *env,
jobject obj, jstring someBody) {
char *a = jstringTostring(env, someBody);
char *b = "Hello.";
const jchar * jcstr = (env)->GetStringChars(someBody, 0);
char* result = (char*) (malloc(strlen(a) + strlen(b) + 1));
strcpy(result, a);
strcat(result, b);
return env->NewStringUTF(result);
}
}
DEMO下载地址:http://download.youkuaiyun.com/detail/yanjunhui2011/9525963