Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)
2015-09-02 17:14
1241 查看
本地方法使用C与C++的实现代码是不同的,且.h头文件必须引用;
在生成jni文件夹同时将生成.h头文件放在该目录下、命令:
进入项目名-->app-->src-->main-->java 目录下输入
javah -d ../jni -jni 包名.类名 (将.h生成头文件放在上级目录中创建jni文件夹中)
Android33\app\src\main\java>javah -d ../jni -jni com.example.yu_longji.android33.MainActivity
生成后的目录结构:
结果:
android33.c
<span style="font-family:KaiTi_GB2312;font-size:18px;">//
// Created by yu_longji on 2015/9/2.
//
#include <jni.h>
#include "com_example_yu_longji_android33_MainActivity.h"
/*
* Class: com_example_yu_longji_android33_MainActivity
* Method: show
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_yu_1longji_android33_MainActivity_show
(JNIEnv * env, jobject obj){
char * str = "这是C++调用";
//return (*env)->NewStringUTF(env, cstr);
return env->NewStringUTF(str);
}</span>
生成的头文件:
布局文件:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textSize="30sp" />
<Button
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:onClick="click"
android:text="C++调用"/>
</RelativeLayout>
MainActivity.java
package com.example.yu_longji.android33;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
static {
System.loadLibrary("Android33");
}
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
}
public void click(View view){
tv.setText(show() + "");
Toast.makeText(this, show() + "", Toast.LENGTH_LONG).show();
}
public native String show();
}
在生成jni文件夹同时将生成.h头文件放在该目录下、命令:
进入项目名-->app-->src-->main-->java 目录下输入
javah -d ../jni -jni 包名.类名 (将.h生成头文件放在上级目录中创建jni文件夹中)
Android33\app\src\main\java>javah -d ../jni -jni com.example.yu_longji.android33.MainActivity
生成后的目录结构:
结果:
android33.c
<span style="font-family:KaiTi_GB2312;font-size:18px;">//
// Created by yu_longji on 2015/9/2.
//
#include <jni.h>
#include "com_example_yu_longji_android33_MainActivity.h"
/*
* Class: com_example_yu_longji_android33_MainActivity
* Method: show
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_yu_1longji_android33_MainActivity_show
(JNIEnv * env, jobject obj){
char * str = "这是C++调用";
//return (*env)->NewStringUTF(env, cstr);
return env->NewStringUTF(str);
}</span>
生成的头文件:
<span style="font-family:KaiTi_GB2312;font-size:18px;">/* * Class: com_example_yu_longji_android33_MainActivity * Method: show * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_yu_1longji_android33_MainActivity_show (JNIEnv *, jobject);</span>
布局文件:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textSize="30sp" />
<Button
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:onClick="click"
android:text="C++调用"/>
</RelativeLayout>
MainActivity.java
package com.example.yu_longji.android33;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
static {
System.loadLibrary("Android33");
}
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
}
public void click(View view){
tv.setText(show() + "");
Toast.makeText(this, show() + "", Toast.LENGTH_LONG).show();
}
public native String show();
}
相关文章推荐
- Android-java调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(二)
- Android-调用本地方法计算int数值相加结果显示在界面上/NDK-JNI开发实例(三)
- Android-调用本地方法将小写字符串转成大写字符串/NDK-JNI开发实例(四)
- Android-调用本地方法传递数组参数/NDK-JNI开发实例(五)
- Android-本地方法C调用Java中的方法/NDK-JNI开发实例(六)
- Android-本地方法与Java相互调用-自定义ProgressBar(锅炉压力监测例子)/NDK-JNI开发实例(七)
- Android-调用本地方法实现将C进程分支出来即生成系统进程/NDK-JNI开发实例(九)
- 带重复元素的排列
- C++简单封装互斥量
- C++编译器如何对Const常量进行分配存储空间
- c++命名空间
- 漫谈C指针第二讲---变量赋值与取地址
- 初识泛型
- 【C++】双向链表
- C++primer 阅读笔记-模板与泛型编程(模板参数)
- 【C++】String_COW(写时拷贝)
- C/C++
- 华为合唱队C++代码
- 漫谈C指针第一讲---C语言变量的实质
- C++访问sql server2008