java调用c库,jni的用法,ndk

之所以标题写这么长是希望有需求的朋友能搜索到。
长话短说,java为了调用c库,需要用到JNI(JAVA本地调用)。见百度百科的介绍:
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

那么如何使用它呢?我摸索了一天,头都疼了,也没搞定,下班迅速撤离公司,到家不甘心再打开笔记本,按照介绍的慢慢来,再找找针对错误提示的回答,居然解决了,所以整理好了供大家使用。mac os下,按照我的方法肯定能成功,linux的话,是很相近的,windows请再补充一点如何布置ndk的知识给自己。

第一步:布置ndk,到http://developer.android.com/tools/sdk/ndk/index.html下载对应操作系统的ndk包,下载后解压缩,建议放在跟android skd或javasdk相同的路径下,当然放在什么位置都无所谓。

第二步:布置环境变量
export NDK_HOME=/Users/dhn/devellop/android-ndk-r8b
export PATH=${PATH}:${NDK_HOME}
注意上述两行只是为了将ndk路径给PATH,NDK_HOME只是为了增强可读性。
将上面两行写入~/.bash_profile或/etc/profile,然后source ~/.bash_profile或source /etc/profile或者你重启shell终端,你懂的。

至此,ndk就算布置好了,可以使用了。那么如何使用呢?

我们新建一个android项目,然后创建一个文件HelloWorld.java,内容如下:

package com.example.androidtest;

public class HelloWorld {
	public native long displayHelloWorld();
	static { 
		System.loadLibrary("jnitest");
	}
}



在项目入口文件中布置如下内容:

package com.example.androidtest;

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

public class MainActivity extends Activity {
	private HelloWorld jt;
	private TextView viewHello;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        jt = new HelloWorld();
        long jtl = jt.displayHelloWorld();
        this.viewHello = (TextView) super.findViewById(R.id.hello);
        this.viewHello.setText(""+jtl);
    }
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}



注意布置相应的activity_main.xml。
然后在shell中进入到项目目录中的src/com/example/androidtest目录,也就是源码位置,执行javac HelloWorld.java,生成HelloWorld.class文件,注意这一步是编译java文件。
然后退回到src目录下,注意这一步很关键,必须退回到src下,也就是项目名的外面。
执行:javah com.example.androidtest.HelloWorld,即项目名.类名。
这时候在src下面会生成头文件:com_example_androidtest_HelloWorld.h
将这个头文件移动到项目中的jni目录(这个目录要先手动创建)下。
然后编写一个xxx.c,这里名字可以随便取,实现里面的函数。
内容如下:

#include <jni.h>
#include "com_example_androidtest_HelloWorld.h"
#include <stdio.h>

JNIEXPORT jlong JNICALL Java_com_example_androidtest_HelloWorld_displayHelloWorld(JNIEnv*  env, jobject thiz) {
	return 100;
}



写好后在jni目录中写一个Android.mk文件,内容如下:

引用

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := jnitest
LOCAL_SRC_FILES := jnitest.c

include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_EXECUTABLE)



注意第一行是LOCAL_MODULE,不要写错了。
然后退回到项目根目录中,即jni目录中执行cd ../,就是jni或src的上层目录。

执行ndk-build即可看到如下信息:

引用

Compile thumb  : jnitest <= jnitest.c
SharedLibrary  : libjnitest.so
Install        : libjnitest.so => libs/armeabi/libjnitest.so



然后运行你的程序吧,你能看到启动程序后界面能显示你的返回值,就代表你成功了!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值