目前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
分享到:
相关推荐
与http://blog.csdn.net/xsz_1025/article/details/52461668配套的代码示例
Android studio 下 NDK Jni 开发 简单demo 谢谢
android_ndk_jni_dev.zip 配套例子
本例演示了最常用的字符、数值、字符数组、数值数组等在free pascal和android虚拟机之间的互相传递。 代码包括这些数据类型转换示例。
一个简单的OpenGL ES 3.0 示例 (Android NDK jni)
Android NDK 开发教程 三 Hello JNI 示例
android ndk 开发入门小例子。 博客地址http://blog.csdn.net/u014702653/article/details/51861013
1.) 在项目根目录下创建jni目录,下面是要放进去的第一个文件Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := main_jni #LOCAL_CFLAGS := LOCAL_SRC_FILES := main.cpp #LOCAL_...
1. android上调用jni 2. 在jni里c代码中调用系统shell 3. 执行shell命令 4. 返回android应用层
例子通过jni调用libzip库读取压缩文件,和通过ndk自带api接口读取assets资源文件,附测试工程。
android jni javame ndk so 制作so文件 一个完整的例子 一份完整的文档 花费哥 3 小时整理
android配置ndk,使用swig编译生成jni Java接口调用c++方法。这是成功的例子,前提是你要配置一下你的环境变量。如有疑问,可以去查看我的博客。有相关内容。
这是展示如何仅使用Android NDK来启动和运行OpenCV演示 这使用NDK Camera2 API获取图像缓冲区 然后使用OpenCV处理图像缓冲区 最后,它获取NDK ANativeWindow并显示图像以供实时预览 演示版 先决条件 Android API 24...
android ndk开发互调示例demo:包括java代码调用C,及C调用java。
一份可供学习的ndk开发示例 使用ndk r4b开发 主要示范如何从android java端传递数据结构以及从ndk接收数据结构 有相应教程: http://blog.csdn.net/hdw_191/archive/2011/02/16/6188852.aspx
android studio 中 进行 JNI 开发的一个简单实例,入门demo
android的jni调用例子,对ndk开发是朋友应该有些帮助!
上次发的代码: http://download.csdn.net/detail/iloveyoueveryday/6909583 好多人说调不通,于是做了个小例子,改了一些东西(其实还是一样的),给大家看看,要是还有问题,就说明是你的NDK环境没有设置好了
Android初涉JNI,从零打造你的第一个demo
我写的例子中还是使用默认的ucs4来处理unicode字符串的。见文件as_base_fun.cpp. 在Android NDK中还没有现成的函数来处理字符串的相互转换,但是Android底层有个libicuuc.so库文件,在目录/system/lib/下可以找到这...