androidndk界⾯开发教程,AndroidNDK开发之⼊门教程
JNI(Java Native Interface, Java本地化⽅法)使得Java能与其它语⾔(如C、C++)的动态库进⾏交互。
在Android 项⽬中,经常看到地图,统计,推送之类的第三⽅平台都⽤了 JNI。
Android NDK(Android Native Development Kit)是⼀系列的开发⼯具,使⽤JNI编程,可以提⾼程序的执⾏效率,更⽅便地使⽤现存的开源库。
⾄于配置NDK环境,⽆论是Cygwin还是最新的(⽆Cygwin),⽹上的教程太多了,这⾥不再赘述。
android学习教程
好了,下⾯开始写⼀个⼊门Demo了……
⾸先新建⼀个Android project
项⽬右键点击-Android Tools -Add Native Support
点击Finish。
可以看到在Android项⽬中⽣成了⼀个JNI⽂件:
然后在MainActivity 中添加以下代码:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
initJNI();
}
private void initJNI() {
TextView tv = new TextView(this);
tv.setTextSize(25);
tv.setBackgroundColor(Color.parseColor("#FFA07A"));
tv.setText(myTestNdk());
tv.setGravity(Gravity.CENTER);
setContentView(tv);
}
public native String myTestNdk();
static {
System.loadLibrary("TestBaseJNI");
}
}
System.loadLibrary("TestBaseJNI")表⽰VM去加载动态库TestBaseJNI.so⽂件;
public native String myTestNdk(),这⾥的native表⽰这个⽅法由本地代码定义,需要通过jni接⼝调⽤本地c/c++代码,在java代码中仅仅是声明。
然后在TestBaseJNI.cpp添加以下代码:
#include
#include
extern "C" {
jstring Java_com_example_testbase_MainActivity_myTestNdk(JNIEnv* env,
jobject thiz) {
return env->NewStringUTF("Hello NDK");
}
}
声明加extern "C",是解决C++函数名问题;
"Java_com_example_testbase_MainActivity_myTestNdk",严格按照这种格式写。开头是Java,后⾯依次是包名,Activity名,⽅法名;
jstring表⽰返回类型,这段函数的功能就是返回字符串"Hello NDK"。
这时候可能会报错。
Type 'jstring' could not be resolved
Method 'NewStringUTF' could not be resolved等等。
遇到这些类错误:
Type 'XXX' could not be resolved
Method  'XXX' ' could not be resolved
常见的解决办法:
右键->Properties,点击C/C++ General展开,点击Path and Symbols, 右侧Includes,点击Add,把NDK⽂件夹下的jni头⽂件和相应的C++头⽂件添加进来
这是我添加的两个路径:
F:\Installer\Programming\android-ndk32-r10b-windows-x86\android-ndk-r10b\toolchains\mipsel-linux-android-
4.8\prebuilt\windows\lib\gcc\mipsel-linux-android\4.8\include
F:\Installer\Programming\android-ndk32-r10b-windows-x86\android-ndk-r10b\platforms\android-19\arch-
arm\usr\include
运⾏成功界⾯:
好了,我们再通过⼿动建JNI的⽅式来实现上⾯的Demo
⾸先新建⼀个Android project
根⽬录建⽴JNI⽂件夹,再分别创建Android.mk和hello-jni.c⽂件
在MainActivity 中添加以下代码:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
TextView myTextView = new TextView(this);
myTextView.setText(stringTestNdk());
setContentView(myTextView);
}
public native String stringTestNdk();
static {
System.loadLibrary("hello-jni");
}
}
hello-jni.c中添加:
#include
#include
/* This is a trivial JNI example where we use a native method
* to return a new VM String. See the corresponding Java source
* file located at:
*
* apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
*/
jstring Java_com_example_testndk_MainActivity_stringTestNdk(JNIEnv* env, jobject thiz) {
return (*env)->NewStringUTF(env, "Hello Test NDK !");
/
/return env->NewStringUTF("Hello NDK");
}
Android.mk配置中添加:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE表⽰编译的动态库名称
LOCAL_SRC_FILES 表⽰源代码⽂件
建⽴并配置Builder:
右键-属性-Builder-New-Main,Refresh,Build中如下配置(按照实际项⽬操作,这⾥只是举例),编译并⽣成.so⽂件。
然后可以看到在在控制台输出信息(如果没有,Project-Clean):
[armeabi] Compile thumb  : hello-jni <= hello-jni.c
[armeabi] SharedLibrary  : libhello-jni.so
[armeabi] Install        : libhello-jni.so => libs/armeabi/libhello-jni.so
在libs-armeabi下⽣成了libhello-jni.so⽂件
运⾏成功截图:
代码就这么⼏⾏,注意操作步骤就OK了,Demo就不上传了……

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。