【JNI】C向C++改造

步骤:

1. 把c文件后缀名换成cpp
2. Android.mk文件中的hello.c也要换成hello.cpp
3. c++的使用的环境变量结构体中,访问了c使用的结构体的函数指针,函数名全部都是一样的,只是参数去掉了结构体指针
4. 访问函数指针时,把env前面的*号去掉,因为此时env已经是一级指针
5. clean,清除之前编译的残留文件
6. 把声明函数的h文件放入jni文件夹中,include该h文件

public class MainActivity extends Activity {

    static{
        System.loadLibrary("hello");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void click(View v){
        Toast.makeText(this, helloC(), 0).show();
    }

    public native String helloC();
}

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.cpp

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_ABI := armeabi x86
#include <jni.h>
#include "com_itheima_cplusplus_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_itheima_cplusplus_MainActivity_helloC
  (JNIEnv * env, jobject obj){
    char* cstr = "hello from c";
  //return (*env)->NewStringUTF(env, cstr);
    return env->NewStringUTF(cstr);
}
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_itheima_cplusplus_MainActivity */

#ifndef _Included_com_itheima_cplusplus_MainActivity
#define _Included_com_itheima_cplusplus_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_itheima_cplusplus_MainActivity
 * Method:    helloC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_itheima_cplusplus_MainActivity_helloC
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
时间: 2024-12-04 14:19:54

【JNI】C向C++改造的相关文章

Android——C语言、JNI与低层调用

JNI java native interface c的基本数据类型 int:32位,能表示的数字是2的32次方个 最高位用来表示符号位,那么还剩下31位可以表示数值,所以能表示的数字就是2的31次方个 int的表示范围: 当最高位是0时:0~2147483647 当最高位是1是:-2147483648~-1 java的基本数据类型长度 c的基本数据类型长度 byte:1 short:2 int:4 long:8 boolean:1 char:2 float:4 double:8 short:2

JNI/NDK开发指南(十一)——JNI异常处理

转载请注明出处:http://blog.csdn.net/xyang81/article/details/45770551 异常简介 异常,显而意见就是程序在运行期间没有按照正常的程序逻辑执行,在执行过程当中出现了某种错误,导致程序崩溃.在Java中异常分为运行时异常(RuntimeException)和编译时异常,在程序中有可能运行期间发生异常的逻辑我们会用try-catch-来处理,如果没有处理的话,在运行期间发生异常就会导致程序奔溃.而编译时异常是在编译期间就必须处理的.本章主要介绍运行时

基于Eclipse的Android JNI层测试应用开发过程记录

前言 本文记录一个Java层与JNI层参数与数据交互的应用程序开发过程,为实现一个功能完整的带Java与JNI的应用程序打下基础.本文假设读者已搭建好Android的Eclipse与NDK开发环境,包括通过ADB连接手机的配置. 1. 构建基本的Android应用程序 1.1 引导界面配置 打开Eclipse,"File"->"New"->"Android Application Project",在弹出界面,配置如下(红色框表示不是

基于Eclipse的Android JNI层測试应用开发过程记录

前言 本文记录一个Java层与JNI层參数与数据交互的应用程序开发过程.为实现一个功能完整的带Java与JNI的应用程序打下基础. 本文如果读者已搭建好Android的Eclipse与NDK开发环境,包含通过ADB连接手机的配置. 1. 构建主要的Android应用程序 1.1 引导界面配置 打开Eclipse,"File"->"New"->"Android Application Project",在弹出界面,配置例如以下(红色框表

Java JVM、JNI、Native Function Interface、Create New Process Native Function API Analysis

目录 1. JAVA JVM 2. Java JNI: Java Native Interface 3. Java Create New Process Native Function API Analysis In Linux 4. Java Create New Process Native Function API Analysis In Windows 1. JAVA JVM 0x1: JVM架构简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种

JNI/NDK开发指南(十)——JNI局部引用、全局引用和弱全局引用

转载请注明出处:http://blog.csdn.net/xyang81/article/details/44657385 ????这篇文章比较偏理论,详细介绍了在编写本地代码时三种引用的使用场景和注意事项.可能看起来有点枯燥,但引用是在JNI中最容易出错的一个点,如果使用不当,容易使程序造成内存溢出,程序崩溃等现象.所以讲得比较细,有些地方看起来可能比较啰嗦,还请轻啪!下一篇文章会写一个在Android由于JNI引用使用不当,造成局部引用表溢出而导致程序闪退的案例,请关注! ????做Java

JNI开发(1)——概述、环境搭建、必要知识点

JNI开发(1)--概述.环境搭建.必要知识点 JNI开发(2)--开发流程实战 同学们,笔者作为一名资深老司机,向大家郑重承诺:"文章的最后会有福利发放,请自备纸巾!!!" 以下是整个 "JNI开发"的主题大纲,由于篇幅的限制,本文就简单的介绍一下关于JNI开发的一些准备工作:概念.环境与必要知识. 1. 关于JNI 1.1 概述 来自 维基百科!!! JNI允许用本地代码来解决纯粹用Java编程不能解决的平台相关的特性.也用于改造已存在的其它语言写的应用程序,供

JNI(Java Native Interface)_02

JNI(Java Native Interface)_02 ndk开发常用术语 观察jni.h文件的c语言细节: 交叉编译 在一种平台下编译出能够在另外一种平台下运行二进制代码 平台(1,操作系统:windows linux mac os solaris 2,cpu x86 arm mips) 交叉编译原理 源代码--->编译---->动态库(.dll,.so)-->目标平台运行 windows 源代码编译成 linux,arm下的可执行文件 ndk开发工具 ndk (native de

Java JNI 编程进阶

原文:http://www.iteye.com/topic/295776 JNI一直以来都很少去关注,但却是我心中的一个结,最近这几天刚好手头有点时间,因此抽空看了一下这方面的东西,整理了一份文档,JNI技术的出现主要是基于三个方面的应用需求: 1. 解决性能问题Java具有平台无关性,这使人们在开发企业级应用的时候总是把它作为主要候选方案之一,但是性能方面的因素又大大削弱了它的竞争力.为此,提高Java的性能就显得十分重要.Sun公司及Java的支持者们为提高Java的运行速度已经做出了许多努