Android NDK的简单例子

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”即可





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值