Ubuntu下NDK环境搭建以及使用


1.下载并解压ndk到任意目录。

2.根据ndk解压目录配置环境变量。

gedit ~/.bashrc

保存退出,然后输入下面的命令来使之生效

source ~/.bashrc



在终端输入vim .hashrc,在最后配置如下:

 

然后“Esc”退出编辑状态,“Shift + :”使终端接受编译器命令,“wp”保存,“q!”或“Ctrl + Z”退回到终端界面,环境变量添加完成。这里注意要重启终端后才会生效。

3.在终端输入ndk-build,如显示如下则环境搭建成功。

4.使用时,先创建java代码,如下:

复制代码
public class JnitestMainActivity extends Activity {
       private EditText edittext;
       private TextView textview;
       private Button btn;    
    
       private native int myFun(int n);
       static {
               System.loadLibrary("jnitest");
       }

       @Override
       protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_jnitest_main);
        
    edittext = (EditText)findViewById(R.id.edit_text);
    textview =(TextView)findViewById(R.id.text_view);
    btn = (Button)findViewById(R.id.button);
    btn.setOnClickListener(new OnClickListener() {
            
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    String content = edittext.getText().toString();
    int n;
    if(!content.equals("")){
            n = Integer.valueOf(content);//ok
            textview.setText(content + "!" + "=" +myFun(n));
            }
     }
        });
}
复制代码

 

然后编译该工程使产生 JnitestMainActivity.class文件,供下一步产生.h文件使用。

5.产生头文件,先在工程中创建jni文件夹,在终端进入工程目录,输入javah -classpath bin/classes -d jni com.test.jnitest.JnitestMainActivity

,具体意义可以用javah –help指令察看,需要说明的是-classpath对应的参数应该为com文件夹所在目录,有的可能是bin。

生成的头文件为:com_test_jnitest_JnitestMainActivity.h

内容是:

复制代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_test_jnitest_JnitestMainActivity */

#ifndef _Included_com_test_jnitest_JnitestMainActivity
#define _Included_com_test_jnitest_JnitestMainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_test_jnitest_JnitestMainActivity
 * Method:    myFun
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_com_test_jnitest_JnitestMainActivity_myFun(
        JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif
复制代码

 

JNIEnv*, jobject是所有jni函数必有的两个参数,分别表示jni环境和对应的java类(或对象)本身

6.编写相应的.c文件,先把上面的函数拷过来,删掉JNIEXPORT和 JNICALL,具体如下:

复制代码
#include <jni.h>
#include <string.h>

jint factorial(jint n) {
    if (n == 1) {
        return 1;
    }
    return factorial(n - 1) * n;
}

jint Java_com_test_jnitest_JnitestMainActivity_myFun(JNIEnv * env,
        jobject this, jint n) {
    return factorial(n);//求阶乘
}
复制代码

完成.c文件后com_test_jnitest_JnitestMainActivity.h就没用了,可删除。

7.编写Android.mk文件,具体如下:

LOCAL_PATH :=$(call my-dir)//必须有

 

include $(CLEAR_VARS)//清除LOCAL开头的变量

http://www.cnblogs.com/kingOfPointer/p/3578638.html


LOCAL_MODULE := jnitest//要生成的库文件

LOCAL_SRC_FILES := jnitest.c//需要编译的C源文件

 

include $(BUILD_SHARED_LIBRARY)//编译成一个共享库

该脚本还有其他宏,感兴趣可以研究下。

8.编译生成.so共享库文件,进入工程目录,输入ndk-build命令,就会在libs/armeabi目录下生成libjnitest.so,重新编译工程,libjnitest.so共享库会一起打包在apk文件内。

 

0
0
(请您对文章做出评价)
«上一篇: android游戏开发之AndEngine引擎效率优化
posted @ 2014-03-03 16:36 pointer2011 阅读( 1273) 评论( 0) 编辑 收藏

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值