JNI+NDK编程总结

网友投稿 635 2022-09-26 08:55:01

JNI+NDK编程总结

软件版本的选择:

1、ADT-Bundle:adt-bundle-windows-x86_64-20131030

理由:这个版本自带Native Developer Tools支持,是否支持看Preferences,有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);

random();

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

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

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中的目录

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

11、为项目添加新的Builder

项目属性->Builders->New->Program:

【Refresh】接着切换到Refresh选项卡:勾选Recursively include sub-folders,即递归进所有的子目录。

13、保存上面的程序,eclipse会自动调用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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:你真的会应用网络营销吗?(为什么说网络营销具有更广阔的应用前景)
下一篇:查询计算机启动了多长时间的工具
相关文章