Android NDK之如何避开Java_xxx标准定义

Java代码:
public class MessageUtil {

static{
System.loadLibrary("sms");
}

public static native void showToast(Object context,String message);

}

jni代码:

文件 -- sms.h
//
// Created by Mrper on 2015/8/2.
//
#include <jni.h>

#ifndef SENDER_SMS_H
#define SENDER_SMS_H

void showToast(JNIEnv *env,jclass clazz,jobject handler,jstring message);

static jint registeNativeMethods(JNIEnv *env,const char* className,JNINativeMethod *methods,int numMethod);

static jint registeNatives(JNIEnv *env);

#endif //SENDER_SMS_H

文件 -- sms.cpp
//
// Created by Mrper on 2015/8/2.
//

#include "sms.h"
#include <stdio.h>

static JNINativeMethod nativeMethods[] = {
{
"showToast",
"(Ljava/lang/Object;Ljava/lang/String;)V",
(void*)showToast
}
};

void showToast(JNIEnv *env,jclass clazz,jobject handler,jstring message){
jclass cls_toast = env->FindClass("android/widget/Toast");
jmethodID mid_showToast = env->GetStaticMethodID(
cls_toast,
"makeText",
"(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;"
);
jobject obj_toast = env->CallStaticObjectMethod(cls_toast,mid_showToast,handler,message,1000);
jmethodID mid_show = env->GetMethodID(cls_toast,"show","()V");
env->CallVoidMethod(obj_toast,mid_show);
}

static jint registeNativeMethods(JNIEnv *env,const char* className,JNINativeMethod *methods,int numMethod){
jclass clazz;
clazz = env->FindClass(className);
if (clazz == NULL) return JNI_FALSE;
if (env->RegisterNatives(clazz,methods,numMethod) < 0){
return JNI_FALSE;
}
return JNI_TRUE;
}

static jint registeNatives(JNIEnv *env){
if (registeNativeMethods(env,"com/mrper/sender/MessageUtil",nativeMethods,
sizeof(nativeMethods)/sizeof(nativeMethods[0]) ) != JNI_TRUE){
return JNI_FALSE;
}
return JNI_TRUE;
}

jint JNI_OnLoad(JavaVM *vm, void*reserved){
jint result = -1;
JNIEnv *env;
vm->GetEnv((void**)&env,JNI_VERSION_1_6);
if (env == NULL){
goto fail;
}
if (registeNatives(env) != JNI_TRUE){
goto fail;
}
result = JNI_VERSION_1_6;
fail:
return result;
}
时间: 2024-08-20 21:03:48

Android NDK之如何避开Java_xxx标准定义的相关文章

Android NDK的C++11标准支持

C++11在Android NDK中已经支持了,本文主要介绍如何在NDK中添加C++11标准的支持. 在开源项目Cocos2d-x中,已经添加了C++11标准的支持. 1.修改Application.mk文件,添加NDK_TOOLCHAIN_VERSION NDK_TOOLCHAIN_VERSION=4.8 2.添加APP_CPPFLAGS,在命令行编辑时支持C++11 APP_CPPFLAGS := -frtti -std=c++11 然后编写测试函数,在JNI中调用此函数即可. #inclu

Android NDK开发及调用标准linux动态库.so文件

源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动将so文件和java应用一起打包成apk.对应:jni层c++开发 2.Cygwin:是windows平台上模拟Linux运行环境的工具,即window平台上的linux环境工具,so文件需要在linux平台上编译运行.对应:arm linux平台 3.CDT:eclipse下的C/C++开发工具,

深入理解Android NDK日志符号化

为了进行代码及产品保护,几乎所有的非开源App都会进行代码混淆,这样当收集到崩溃信息后,就需 要进行符号化来还原代码信息,以便开发者可以定位Bug.基于使用SDK和NDK的不同,Android的崩溃分为两类:Java崩溃和C/C++崩溃.Java崩溃通过mapping.txt文件进行符号化,比较简单直观,而C/C++崩溃的符号化则需要使用Google自带的一些NDK工具,比如ndk-stack.addr2line.objdump等.本文不去讨论如何使用这些工具,有兴趣的朋友可以参考同事写的另一篇

Linux下Android NDK环境配置以及配合eclipse使用NDK

最近由于项目中经常用到jni,在这里将使用jni不步邹分享给大家! 一.下载NDK http://developer.android.com/sdk/ndk/index.html 目前最新版本是r8(android-ndk-r8-linux-x86.tar.bz2) 二.配置环境 从r7版本开始,Linux下直接解压就可以使用,在windows下cygwin也已经集成在NDK里面了,解压完配置下环境变量就可以使用了. 在~/.bashrc(Linux下配置环境变量的文件)文件末尾加上: expo

下面就介绍下Android NDK的入门学习过程(转)

为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大. 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的. 3. 便于移植,用C/C++写得库可以方便在其他的嵌入式平台上再次使用. 下面就介绍下Android NDK的入门学习过程: 入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的. 一

【转】Android NDK开发入门实例

写这个,目的就是记录一下我自己的NDK是怎么入门的.便于以后查看,而不会忘了又用搜索引擎一顿乱搜.然后希望能够帮助刚学的人入门. 先转一段别人说的话: “NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. * NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU.平台.ABI等差异,开发人员只需要简单修

Android NDK开发(六)——使用开源LAME转码mp3

转载请注明出处:http://blog.csdn.net/allen315410/article/details/42456661 在本专栏的前面几篇博客中讲述了一些Android NDK开发的基础,从环境搭建一直到利用JNI进行Java端和C端代码的互相调用,并且的讲解的Demo也是很简单易懂的,相信掌握前面博客的大部分内容,就可以着手在实际项目中利用JNI进行NDK开发了,那么既然基础过了,接下来我在这里尝试去使用真实项目中去.我们知道,C语言因为高效,而且又是最早期的高级编程之一,一直存活

Android NDK开发入门实例

AndroidNDK是能使Android应用开发者把从c/c++编译而来的本地代码嵌入到应用包中的一系列工具的组合. 注意: AndroidNDK只能用于Android1.5及以上版本中. I. Android NDK 目标: Android虚拟机允许你的应用在源码中通过JNI调用本地代码(c/c++)中实现的方法们.概括起来,这表示: --你的应用的java源代码中要声明一个或多个方法,这些方法前面需有'native'关键字,这表明它们被本地代码实现.如: [java] view plainc

基于 Android NDK 的学习之旅----- C调用Java

http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html 基于 Android NDK 的学习之旅----- C调用Java许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法. 1.主要流程 1.  新建一个测试类TestProvider.java a)