JNI+NDK编程总结

软件版本的选择:
1、ADT-Bundle:adt-bundle-windows-x86_64-20131030
理由:这个版本自带Native Developer Tools支持,是否支持看Preferences,有NDK项就是支持了。可以安装插件,这里略过,选择集成了最简单。
  JNI+NDK编程总结

adt-bundle-windows-x86_64-20140702这个版本不支持
2、NDK版本:android-ndk-r10e-windows-x86.exe
这个还不是64位的,应该没有问题

3、创建工程testNDK,因此包名写成了cn.maxma.testndk,都是小写的
里面就一个类MainActivity,派生自Activity。

4、主要代码如下:

public class MainActivity extends Activity {

   

    private TextView tv;

    private Button btn;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        //

        tv = (TextView) findViewById(R.id.textView1);

        btn = (Button) findViewById(R.id.button1);

       

    }

         // android:onClick="clickMe"

public void clickMe(View view){

        double randowmDouble= Math.random();

       long x=Math.round(randowmDouble*100);

        randowmDouble = Math.random();

        long y=Math.round(randowmDouble*100);

   

        System.loadLibrary("testNDK");

       

        long z = add(x, y);

        String msg=x+" + "+y+" = "+z;

        tv.setText(msg);

}

   

public native long add(long x,long y);

}


上面的
System.loadLibrary("testNDK");
没有加static作为静态代码块。

5、在项目根目录创建jni目录

6、给项目添加Native Support
项目右键/Android Tools/Add Native Support
会弹出框,设置编译生成的共享库文件*.so 的文件名
Library Name:lib***.so
上面的***是供输入的名称,默认就是项目名,即:testNDK,这样最后产生的库文件名称为libtestNDK.so,存放在lib目录下面对应的CPU下面。

上面的对话框确认之后,会自动在上一步的jni目录中生成两个文件:
testNDK.cpp
Android.mk
7、上面的testNDK.cpp文件就一行
#include  
剩下来的是要写代码去实现安卓中的那个声明过的native方法add
8、Android.mk文件已经帮我们写好了:
LOCAL_PATH :=$(call my-dir)

Include $(CLEAR_VARS)

LOCAL_MODULE :=testNDK
LOCAL_SRC_FILES :=testNDK.cpp

Include $(BUILD_SHARED_LIBRARY)
这个代完全不必去改动它,暂时也可以不必理会里面的具体含义。

9、编写C语言的函数体
JNIEXPORT jlong JNICALL Java_cn_maxma_testndk_MainActivity_add(
JNIEnv * env,jclass thiz,jlong x,jlong y)
{
return x+y;
}
注意:上面的jclass的参数改成了thiz是因为this是关键字 

10、增加C/C++搜索路径
项目属性->C/C++ General->Paths and Symbols->Add
添加NDK中的目录
  JNI+NDK编程总结

确认之后,上面的程序代码下的错误指示波浪线消失。

11、为项目添加新的Builder
项目属性->Builders->New->Program:
JNI+NDK编程总结

【Refresh】接着切换到Refresh选项卡:勾选Recursively include sub-folders,即递归进所有的子目录。
【Build Options】接着切换到Build Options,勾选最后一个选项,然后点击“Specify Resources…”,选择项目中的jni目录。

13、保存上面的程序,eclipse会自动调用ndk进行编译,结果:
JNI+NDK编程总结
[armeabi] Compile++ thumb: testNDK <= testNDK.cpp
[armeabi] StaticLibrary  : libstdc++.a
[armeabi] SharedLibrary  : libtestNDK.so
[armeabi] Install        : libtestNDK.so => libs/armeabi/libtestNDK.so
上面最后一句的意思是生成了*.so文件,并且存放到libs/armeabi/目录中了。

如果NDK的版本更高些的话,比如R12e,会编译出多个so文件,最后的行数会大大增加:
[x86] install :libtestNDK.so  =>  libs/x86/libtestNDK.so
[mips] install :libtestNDK.so  =>  libs/mips/libtestNDK.so

14、各种错误现象
W: No implementation found for native Lcn/maxma/testndk/MainActivity;.add:(JJ)J
E: FATAL EXCEPTION: main
E: java.lang.IllegalStateException: Could not execute method of the activity

转载于:https://www.cnblogs.com/maxma/p/9169574.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值