java JNI

讲解java虚拟机以及堆和栈的:http://blog.csdn.net/cutesource/article/details/8244250

编辑helloJNI.java

class helloJNI {

        public native int  get();
        public native void set(byte c);
        static {
            //System.out.println(System.getProperty("java.library.path"));
            System.load("/usr/lib/helloJNI.so");
            //System.out.println("loading ok");
        }
        public static void main(String[] args) {
            System.out.println("ing main 1");
            helloJNI test = new helloJNI();
            System.out.println("ing main ");
            byte c  = (byte)0xff;
            test.set(c);
            System.out.println("ing main 3");
            System.out.println("test:"  +  String.valueOf(test.get()));
        }
}

javac helloJNI.java

生成头文件:javah -jni helloJNI

编辑helloJNI.cpp

#include "helloJNI.h"
int ret=0;
JNIEXPORT jint JNICALL Java_helloJNI_get
  (JNIEnv *env, jobject jo)
{
    return ret;
}

JNIEXPORT void JNICALL Java_helloJNI_set
  (JNIEnv *env, jobject jo, jbyte c)
{
    unsigned char cc = c;
    ret = cc;
}

编译:

gcc -I/usr/local/lib/jdk1.7.0_71/include/linux -I/usr/local/lib/jdk1.7.0_71/include -fPIC -shared -o helloJNI.so helloJNI.c

将 helloJNI.so 复制到/usr/lib中:

sudo cp -v helloJNI.so /usr/lib/

这里执行javah命令时与class文件在同一目录下。而如果class文件放入了包中

如:

package com.test.demo;

class TestHello{

...

}

需要建立相应的目录com/test/demo/TestHello.class

然后退出到com目录的上层目录进行:javah -jni com.test.demo.TestHello

就能够正确的生成TestHello.class的头文件了,(头文件位于当前目录下)。

jar -cvf TestHello.jar com/test/demo/TetsHello.class

------

http://blog.csdn.net/liu251/article/details/3953906

时间: 2024-10-07 15:51:09

java JNI的相关文章

关于java jni编译javac javah的问题

这篇文章是在安卓教程网http://android.662p.com那边分享过来的,文章说得还不错的,希望能够帮到大家的学习. javac  编译class文件命令,需要注意的是当类B中import类A时,在编译B时要包含A的路径,如 project  src  com.jl.test  A.java com.jl.test2 B.java B中importA,在编译B时应该  : javac  -cp ~/project/src  B.java       (-cp :classpath简称,

java JNI 的实现(2)-java和C/C++的相互调用.

目录 概述 一,java代码 二,稍微注意通过javah生成的'C/C++'.h头文件和源java代码的关系 三,在C/C++中实现java的native方法(完整C/C++) 1,修改age,即Java_juk_demo_JSay_changeAge方法 2,调用java中的'javaStatic'方法,和上面C/C+实现方法相似 3,最后测试 概述 从第一篇java JNI 的实现(1)-又进一步加深对JVM实现的理解对JNI有了大致的理解之后,并知道JNI中java如何调用C/C++等,这

编程基础知识——Java JNI开发流程(2)

android中使用jni调用本地C++库 android平台上的本地库文件后缀 .so.类似windows上的dll文件. 要在android上使用jni,首先需要下载android ndk. 操作步骤,正常建立android工程,然后在android工程那里右键,属性,选择Android Tools -> Add Native Support.就可以为android工程增加本地库支持. 添加支持后的android工程,会增加jni目录,C++代码就写在这个目录里. 新建一个类,并且使用nat

Android(Java):jni源代码

public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        Button btn = new Button(this);        btn.setText("测试ndk");        btn.setOnClickListener(new ButtonOnClickListener());        setContentView(

java JNI 调试出现的错误

java JNI 调试出现的错误 ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/util.c:820] 请在代码最后加入以下语句:System.exit(0)即可(在main函数结束时,添加system.exit(0):), 注意,只需要在这种情况下加

JAVA JNI学习

JAVA JNI   JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了. 设计目的 标准的java类库可能不支持你的程序所需的特性. JNI 或许你已经有了一个用其他语言写成的库或程序,而你希望在ja

Mac下Java JNI (java native interface)调C

1.编写带有native声明的方法的Java类 2.使用javac命令编译编写的Java类 3.使用java -jni className 来生成后缀名为.h的头文件 4.使用其他语言(C.C++)实现本地方法 5.将本地方法编写的文件生成动态链接库 一代码:(不要带包路径) /** * native-0study * * @author xuedui.zhao * @create 2018-04-23 */public class HelloWorld { public native void

java JNI 实现原理 (二) Linux 下如何 load JNILibrary

在博客java JNI (一)虚拟机中classloader的JNILibrary 中讨论了java中的Library 是由classloader 来load的,那我们来看看 classloader是如何去load 一个library的. ClassLoader.c [cpp] JNIEXPORT void JNICALL Java_java_lang_ClassLoader_00024NativeLibrary_load (JNIEnv *env, jobject this, jstring

Java JNI机制

java JNI机制 JNI概述及简单例子介绍 系统环境代指本地操作系统环境,它有自己的本地库和CPU指令集.本地程序(Native Applications)使用C/C++这样的本地语言来编写,被编译成只能在本地系统环境下运行的二进制代码,并和本地库链接在一起.本地程序和本地库一般地会依赖于一个特定的本地系统环境.比如,一个系统下编译出来的C程序不能在另一个系统中运行. ????JNI的强大特性使我们在使用JAVA平台的同时,还可以重用原来的本地代码.作为虚拟机实现的一部分,JNI允许JAVA

java——JNI(例子控制台(64位)清屏

因为java的最底层是jvm,所以单纯的控制台java程序不能感知jvm再下面的操作系统的情况, 可以通过JNI(Java Native Interface)技术实现java后台调用C++/C的dll(Dynamic Linkable Library,动态链接库)文件. 不过,对Java外部的调用通常不能移植到其他平台,在applet中还可能引发安全异常.实现本地代码将使您的Java应用程序无法通过100%纯Java测试.但是,如果必须执行本地调用,则要考虑几个准则: 1.将您的所有本地方法都封