234.JNI简单使用eclipse--hello world

##NDK目录结构
* docs:帮助文档
* build/tools:linux的批处理文件
* platforms:编译c代码需要使用的头文件和类库
* prebuilt:预编译使用的二进制可执行文件
* sample:jni的使用例子
* source:ndk的源码
* toolchains:工具链
* ndk-build.cmd:编译打包c代码的一个指令

 

                                                   

使用JNI的方法:

第一步:创建一个app项目,在根目录下面创建一个jni的文件夹

                                          

第二步:在jni文件中创建一个c文件

第三步: 在java代码中,创建一个本地方法helloFromC,这个方法的方法体由C语言实现

public native String helloFromC();

第四步: 在jni中定义函数实现这个方法,函数名必须为下面的形式。其中

JNIEnv:是java运行环境的指针,也就是java虚拟机的内存地址

obj:在本地方法中声明的对象引用,是哪个对象调用的(MainActivy),C语言中没有这个,因此直接使用jobject代替对象

//java中准备调用函数的包名+类名+方法名
jstring Java_com_ldw_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj)

第五步: 返回一个字符串,用c定义一个字符串

char* cstr = "hello from c";

第六步: 把c的字符串转换成java的字符串

jstring jstr = (*env)->NewStringUTF(env, cstr);
return jstr;

第七步:在jni中创建Android.mk文件

 LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)
	#编译生成的文件的类库叫什么名字
    LOCAL_MODULE    := hello
    #要编译的c文件
    LOCAL_SRC_FILES := Hello.c

    include $(BUILD_SHARED_LIBRARY)

第八步: 在c文件中添加<jni.h>头文件

第九步:在jni文件夹下执行ndk-build.cmd指令

目录下会生成相应的类库

                      

                           

第十步:java代码中加载so类库,调用本地方法。

引用的so类库是libs/armeabi下面的so文件[libhello.so],掐头去尾,只剩下hello,这样来引用类库

static{
		//加载打包完毕的so类库
		System.loadLibrary("hello");
	}

 完整代码

MainActivity.java

package com.ldw.helloworld1;

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

public class MainActivity extends Activity {

	static{
		//加载打包完毕的so类库
		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, helloFromC(), 0).show();
    }
    
    //定义一个本地方法,方法体由c语言实现
    public native String helloFromC();
    
}

01_HelloWorld/jni/Hello.c

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

//java中准备调用函数的包名+类名+方法名
jstring Java_com_ldw_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj){
	//c语言的字符串
	char* cstr = "hello from c";
	//把c语言的字符串转换成java的字符串
	//jni.h中对应的方法===》jstring     (*NewStringUTF)(JNIEnv*, const char*);
	//	jstring jstr = (*(*env)).NewStringUTF(env, cstr);
	jstring jstr = (*env)->NewStringUTF(env, cstr);
	return jstr;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值