Android NDK开发

安装好eclipse、ADT、NDK(r9以上)后,编写NDK的具体步骤:

1.新建一个Android project

file->new->project...->android->android application project,next。。。。。。


2.新建一个jni文件

工程,右键android tools->add native support...,给.so文件取名,完成后,工程中自动生成


myNdk.cpp文件中编写底层的代码,Android.mk文件中一般不需修改

3.myNdk.cpp

#include <jni.h>
#include <string.h>

extern "C" {
JNIEXPORT jstring JNICALL Java_com_example_androidndk_JNI_getString(JNIEnv* env, jobject obj)
{
    //返回一个字符串
    return (env)->NewStringUTF("Hello NDK!");
}
}

JNI接口的命名规范是:Java_ + 调用该方法的包名(包名的点用_代替,即com_example_androidndk) + _ + 调用该接口的类名(即JNI) + _ + 方法名(即getString),对于实例方法,有两个参数是必要的,一个JNI的环境指针JNIEnv *,另一个是调用该方法的Java实例jobject,如果还需要传入参数,可在和两个参数后面接着加上去,例

JNIEXPORT jint JNICALL Java_com_example_androidndk_JNI_add(JNIEnv* env, jobject obj, jint a, jint b)
注:

这里加上extern“C”,是为了从C语言导出,避免错误出现如下错误

4.新建调用JNI

右键src下的包名(即将其和mainactivity同目录),new->class,输入名称JNI,即myNdk.cpp中调用该接口的类名(此二者名称应相同,但不一定要用JNI)

package com.example.androidndk;

//此文件相当于函数声明
public class JNI {

    //获取字符串  
    public native String getString();  
    
}
为什么要建这么一个文件,从个人理解上来说,你可以吧JNI.java看成class中的.h文件,把myNdk.cpp看成class中的.cpp文件,这样将来不管那个java文件调用相关的函数,都可以从JNI.java中调用

5.建立.so文件

只需build一下,eclipse就自动建立了.so文件


此时,可能会出现如下错误:Unable to launch cygpath. Is Cygwin on the path?

解决办法:

1)工程右键,点Properties->C/C++ Build的Building Settings中去掉Use default build command,然后输入${NDKROOT}/ndk-build.cmd


2)在C/C++ Build中点击Environment,点Add...添加环境变量NDKROOT,值为NDK的根目录


6.使用

在mainactivity.java中使用函数

package com.example.androidndk;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

	//使用静态代码块加载类库  
    static{  
        System.loadLibrary("myNdk");//一定要注意名称没有“lib"  
    }  
    
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
    	
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        Button btn1 = (Button)findViewById(R.id.show_btn);  
        //定义本地类  
        final JNI jni = new JNI();  
        
        btn1.setOnClickListener(new View.OnClickListener(){  
        	@Override
            public void onClick(View v) {  
                //显示从C代码中返回的字符串  
                Toast.makeText(getApplicationContext(), jni.getString(), Toast.LENGTH_SHORT).show();  
            }
        });  
        
    }  
}
运行程序



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值