Android的Jni调用获取字符串

本文介绍了如何在Android应用中使用JNI进行本地库调用来获取字符串。首先,通过创建jni目录并配置工程属性来设置NDK编译。接着,在Builder设置中指定Program,用于执行NDK编译,并确保在刷新和构建选项中正确配置了jni目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<p><span style="color:#ff0000;">之前请确保您已配置好<span style="font-family:Times New Roman;">java</span><span style="font-family:宋体;">的环境并配置好了变量;</span></span></p><p>1、创建<span style="font-family:Times New Roman;">Android</span><span style="font-family:宋体;">工程如下,一直默认设置建立好</span><span style="font-family:Times New Roman;">Android</span><span style="font-family:宋体;">工程</span></p>

创建好以后,build project,然后run Android application,运行界面如下:

我们来看一下MainActivity.java代码如下
package com.hellojni;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_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;
	}

}

接着在工程HelloJni根目录下面创建jni目录文件夹

接着配置工程HelloJniproperty-builder,然后选择右边的选项卡new 一个builder,弹出如下界面,我们选择Program选项


接着配置面板如下:


填充Location选项和workingDirectory,对应如下界面,这里我们选择ndk编译


接着在Refresh刷新选项卡中选择,特定资源如下图,选择jni


接着在build option选项中,设置如下


然后把我们刚建立的ndk_builder 上移到第一位置,如下图



接着在Jni目录下面添加Android.mk编译文件如下设置
LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS)  
LOCAL_MODULE    := HJni
LOCAL_SRC_FILES := HelloJni.c  
include $(BUILD_SHARED_LIBRARY)
这里指定我们的Jni模块的名字为HJni,Jni下面指定一个源文件是HelloJni.c 
下面我们回到HelloJni的Src下面的MainActivity.java中
package com.hellojni;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_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;
	}
}
添加下列,导入引用组件
import android.util.Log;
import android.widget.TextView;


	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
//创建TextView,并调用C++返回的字符串
		TextView tv = new TextView(this);
		tv.setText(StringFromJni());
		//打印log,这个可以再Eclipse下面的LogCat中看到
		Log.v("tag", "message_flyingbird"); 
		setContentView(tv);
		//setContentView(R.layout.activity_main);
	}

	//调用c++实现的函数声明
	public native String StringFromJni();
	//添加引用HJni块信息
	static {
		System.loadLibrary("HJni");
注意这里的HJni与之前的Android.mk中的LOCAL_MODULE必需对应上,这样才能保证调用会走到HelloJni.c中
}
接着我们在Jni下添加HelloJni.c文件
#include <string.h>
#include <jni.h>
#include <android/log.h>

JNIEXPORT jstring 
Java_com_hellojni_MainActivity_StringFromJni( 
JNIEnv* env,jobject this)
{
return (*env)->NewStringUTF(env, "Hello ,flyingbird!")
}
这里的回调函数有一个要求,函数的命名规则如下
函数名也有相关的命名规则 即Java_包名_类名_方法
com_hellojni对应包名,MainActivity对应我们的Java类,StringFromJni对应类中的具体的方法,ok,到此为止,重新clean,build,run Android application,这时我们终于看到了果实,,赞一个。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值