NDK_HelloWorld开发指南

本文分享了一个简单的Android NDK示例项目,包括Java层调用本地方法的实现及JNI层的具体编码细节,有助于初学者理解如何使用NDK进行开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发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);
}

}


代码量比较少,而且这里也没有讲到配置NDK的基础步骤(可自行从别的博客查询基本的配置方法)。

DEMO下载地址:http://download.youkuaiyun.com/detail/yanjunhui2011/9525963

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值