C/C++在ndk开发中的区别

原创 2013年12月03日 20:11:58

一、C/C++在ndk开发时的区别主要体现在2个方面

1、Android.mk中增加以下代码:

 LOCAL_CPP_EXTENSION := cpp


2、这时候jni目录下的文件名应该命名为Hello.cpp(以Hello为例)

而且,一般的情况下,加入涉及到字符串的转换,还需要

#include <malloc.h>
#include <stdlib.h>



代码的下载链接为:http://download.csdn.net/detail/caihongshijie6/6651737


二、代码实现

1、main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="调用c++代码"
        android:onClick="click"
         />

</LinearLayout>


2、MainActivity

package com.njupt.cpp;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

    static{
    	System.loadLibrary("Hello");
    }
    
    public native String helloInC();
    public native String helloInC(String str);
    
    public void click(View v){
    	Toast.makeText(this, helloInC("haha in cpp..."), 1).show();
    }
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


3、Hello.cpp

#include <stdio.h>
#include <jni.h>
#include <malloc.h>
#include <stdlib.h>

#include "com_njupt_cpp_MainActivity.h"

#include <android/log.h>//include  D:\android-ndk-r7b\platforms\android-8\arch-arm\usr\include\android下的log.h这个目录
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

/**
 * c++版的将java风格的字符串转化成c风格的字符串...
 */
char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr)
{
	 char*   rtn   =   NULL;
	 jclass   clsstring   =   (env)->FindClass("java/lang/String");
	 jstring   strencode   =   (env)->NewStringUTF("UTF8");
	 jmethodID   mid   =   (env)->GetMethodID(clsstring,   "getBytes",   "(Ljava/lang/String;)[B");
	 jbyteArray   barr=   (jbyteArray)(env)->CallObjectMethod(jstr,mid,strencode); // String .getByte("GB2312");
	 jsize   alen   =   (env)->GetArrayLength(barr);
	 jbyte*   ba   =   (env)->GetByteArrayElements(barr,JNI_FALSE);
	 if(alen   >   0)
	 {
	  rtn   =   (char*)malloc(alen+1);         //"\0"
	  memcpy(rtn,ba,alen);
	  rtn[alen]=0;
	 }
	 (env)->ReleaseByteArrayElements(barr,ba,0);  //
	 return rtn;
}


JNIEXPORT jstring JNICALL Java_com_njupt_cpp_MainActivity_helloInC__
  (JNIEnv * env, jobject){

	return env->NewStringUTF("hello jni in cpp..");
}


JNIEXPORT jstring JNICALL Java_com_njupt_cpp_MainActivity_helloInC__Ljava_lang_String_2
  (JNIEnv * env, jobject, jstring jstr){

	char* str = Jstring2CStr(env,jstr);

	LOGD("%s",str);

	return env->NewStringUTF("我的女神是章泽天...");
}


4、Android.mk

LOCAL_PATH := $(call my-dir)

   include $(CLEAR_VARS)

   LOCAL_CPP_EXTENSION := cpp
   LOCAL_MODULE    := Hello   
   LOCAL_SRC_FILES := Hello.cpp
   LOCAL_LDLIBS += -llog
   
   include $(BUILD_SHARED_LIBRARY)





版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

利用IDEA进行JNI开发:使用NDK生成Linux平台下的so文件

使用NDK生成Linux平台下的so文件和使用MinGW生成Windows平台下的dll文件前半部分是一样的,都是用javah生成头文件,再根据头文件编写.c(C文件)或者.cpp文件(C++文件),...

利用IDEA和exe4j生成exe文件及资源文件和so、dll文件的放置

在网上搜索大部分文章,发现并不能完全解决自己的问题时,遂自己摸索,然后总结写下此文。 在贴出具体步骤前,我们需要先换位思考下,假如我们是设计者我们该如何让一个java项目展现在用户面前呢 1.首先得有...

NDK开发 从入门到放弃(四:JNI函数、C与C++调用函数的区别)

JNI入门级函数、C与C++调用JNI函数的区别

CC++初学者编程教程(10) 搭建Android java C/C++ NDK QTforAndroid 开发环境

1 安装JDK 2 点下一步  3 点下一步 4 开始安装 5 定制路径,点下一步  6 开始安装 7 安装完成,  8 解压缩 ...

Android-NDK开发之第四个例子--用C/C++调用Java

用C/C++调用Java的方法我没有去研究,也不知道从哪里开始研究,对Linux我了解到很少,希望有朋友可以给些资料,我的水平很差,望大家多多包涵。   这个例子是别人的代码,我忘记从来里弄来的了,...
  • GEOLO
  • GEOLO
  • 2011年01月28日 09:34
  • 8842

JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量

在上一章中我们学习到了如何在本地代码中访问任意Java类中的静态方法和实例方法,本章我们也通过一个示例来学习Java中的实例变量和静态变量,在本地代码中如何来访问。静态变量也称为类变量(属性),在所有...
  • xyang81
  • xyang81
  • 2015年01月18日 21:37
  • 7406

eclipse开发cocos2dx 3.2环境搭建之一: Android C\C++环境搭建(ndk r9d)

这几天有时间,琢磨一下cocos2dx。cocos2d家族其实挺庞大的,也有cocos2d-android这种可以直接用Java语言来开发的,但是cocos2d-android资料相对少一些,而且貌似...

怎样用 C/C++ 开发一个原生程序运行在 Android 下而不用 ADK、NDK

熟悉 Android 与 Linux 的开发者看到这篇弱弱的文章该会嘲笑了,不过这篇文章是写给那些还不知道的开发者的。当然如果你对此比较熟悉,又打算看下去,我会感到很高兴的。:) 众所周...

Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用

Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用

Android NDK开发配置Eclipse配置c和c++头文件生成工具

在Eclipse顶部菜单栏选择Run->External tools
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C/C++在ndk开发中的区别
举报原因:
原因补充:

(最多只允许输入30个字)