目前Android NDK只能编译出动态库.so文件,并不是能生成.apk文件,这里我们简单介绍下NDK中的Hello JNI列子。整个例子分Java和Native C两个部分。首先是我们常用的Java端调用部分。

package com.example.hellojni;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;

public class HelloJni extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

TextView tv = new TextView(this);
tv.setText( stringFromJNI() ); //如果调用失败将会抛出 java.lang.UnsatisfiedLinkError异常
setContentView(tv);
} //注意下面的native关键字

public native String stringFromJNI();
public native String unimplementedStringFromJNI();

static {
System.loadLibrary("hello-jni"); //载入hello-jni库
}
}

需要注意的是这里必须设置SDK版本为1.5或以上版本即在androidmanifest.xml文件中指明<uses-sdk android:minSdkVersion="3" /> 这里我们看到JNI调用无需特殊的权限。

而在Native C/C++中我们可以直接使用C++库,不过这里包含了jni这个头文件。

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

其中下面的返回类型jstring是VM String,在jni.h头文件中有定义

jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI, Android123 Test!");
}

其实很好理解的,仅仅是换个了别名而以,定义如下

typedef uint8_t jboolean; /* unsigned 8 bits */
typedef int8_t jbyte; /* signed 8 bits */
typedef uint16_t jchar; /* unsigned 16 bits */
typedef int16_t jshort; /* signed 16 bits */
typedef int32_t jint; /* signed 32 bits */
typedef int64_t jlong; /* signed 64 bits */
typedef float jfloat; /* 32-bit IEEE 754 */
typedef double jdouble; /* 64-bit IEEE 754 */
#else
typedef unsigned char jboolean; /* unsigned 8 bits */
typedef signed char jbyte; /* signed 8 bits */
typedef unsigned short jchar; /* unsigned 16 bits */
typedef short jshort; /* signed 16 bits */
typedef int jint; /* signed 32 bits */
typedef long long jlong; /* signed 64 bits */
typedef float jfloat; /* 32-bit IEEE 754 */
typedef double jdouble; /* 64-bit IEEE 754 */
#endif


typedef jint jsize;

还有一些调用平时注意的声明

#define JNI_FALSE 0
#define JNI_TRUE 1

#define JNI_VERSION_1_1 0x00010001
#define JNI_VERSION_1_2 0x00010002
#define JNI_VERSION_1_4 0x00010004
#define JNI_VERSION_1_6 0x00010006

#define JNI_OK (0) /* no error */
#define JNI_ERR (-1) /* generic error */
#define JNI_EDETACHED (-2) /* thread detached from the VM */
#define JNI_EVERSION (-3) /* JNI version error */

#define JNI_COMMIT 1 /* copy content, do not free buffer */
#define JNI_ABORT 2 /* free buffer w/o copying back */

#define JNIIMPORT
#define JNIEXPORT
#define JNICALL

更多相关文章

  1. Android(安卓)display架构分析-SW架构分析(1-8)
  2. Eclipse proguard 代码混淆 微信第三方库 Can\'t process class
  3. Android(安卓)调用系统应用选文件
  4. Android(安卓)安装apk时,报错 Failure [INSTALL_FAILED_TEST_ONLY
  5. android input命令 模拟按键
  6. android数据库操作之直接读取db文件
  7. Android中JNI调用
  8. 使用Android(安卓)AsyncTask异步线程
  9. pAdTy_-5 保存数据

随机推荐

  1. Android(安卓)WebView由于重定向造成的go
  2. 仿微信-界面动画(5)ViewPager详解
  3. Android(安卓)Support Library Revision
  4. Android(安卓)Studio3.4.0,新建项目出现“
  5. Android(安卓)图片轮播控件
  6. Android知识点的总结目录
  7. Android中万能的BaseAdapter
  8. Android中在string的xml文件中添加空白字
  9. Android(安卓)MMS 源码目录结构
  10. Android界面开发之样式定义(Defining Styl