上层Java APP如何调用底层C++ Code?(就像使用Android SDK一样)
比如我用C++调用Linux系统中的API来封装File族函数功能,现在想对上面的APP提供一个叫File的Java类。一般怎么做。(只是比喻)
现在想开发下图红色粗框中的部分供上层调用,不知道需要做哪些事,用什么方法技术?

解决方案 »

  1.   

    尝试使用JNI的方法调用。没有试过,不知道结果会怎么样。
      

  2.   

    使用jni就可以实现的,具体可以参考一下android的源代码.
      

  3.   

    扩充Framework , 利用JNI , 调用本地实现库
      

  4.   

    既然要用底层的c 为什么不直接使用ndk开发? 
    如果在app层频繁使用java封装的API 用jni函数调用底层的c 并不是一个很有效率的做法 
    就像你说的file 既然c给你了file 你就直接写c去用file不就好了 
    我觉得 尽量避免频繁使用jni调用c code  
    jni的效率真的不高
      

  5.   

    两种方案:
    1.如楼上诸位所说,将其加入到framework中,通过jni方式调用。
    2.使用System.loadLibrary(...),在程序中加载so库,直接调用其中的api。
      

  6.   


    你好:
        小弟新手。最近也在做这方面的研究。想问一下,这个两个方法有什么本质的不同吗?方法2不需要JNI 来封装一下吗?可以直接调用吗?
      

  7.   

    关键看做什么了,要从本质来看,你要知道c到底哪些比java有优势,比如数学运算,效率敏感的操作,因为有指针,内存可以手动的控制,对于文件读写方面其实 java 运行库也是底层的c,所以意义不大,jni执行次消耗不小的
      

  8.   

    恩 我的意思是 用jni把c封装成api使用 不如把所有可以用c处理的用ndk实现 不需要再自己添加api 个人意见
      

  9.   

    google并不想维护多种api,ndk本身就支持c和c++以及数学库,部分socket以及opengl库,需要了自己可以添加,但ui是java写的,没啥好办法,自己diy吧
      

  10.   

    以下是JNI 的实现步骤:
    1. 编写带有native 声明的方法的java 类
    2. 使用javac 命令编译所编写的java 类
    3. 使用javah ?jni java 类名生成扩展名为h 的头文件
    4. 使用C/C++实现本地方法
    5. 将C/C++编写的文件生成动态连接库其实使用原生代码(C,C++)是很有用的,比如高性能和高保密的应用逻辑用C开发,可以提高效率,可重用性和安全性。最好是内存需求少,CPU需求多的应用。
    NDK 是编译嵌入在Android 应用中的原生代码的工具,提供交叉编译。可以生成原生代码库,并将原生代码库嵌入APK应用中。还有上面的问题,JNI是一种实现库的方式。loadLibrary是一种加载库的方式。//android 中调用的代码
    public class HelloJni extends Activity
    {
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    TextView tv = new TextView(this);
    tv.setText( stringFromJNI() );
    setContentView(tv);
    }
    public native String stringFromJNI();
    public native String unimplementedStringFromJNI();static {
    System.loadLibrary("linhai-jni");
    }
    }//NDK 中的代码
    //用本地方法返回一个VM的String.
    jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,jobject thiz )
    {
    return (*env)->NewStringUTF(env, "Hello from JNI !");
    }
      

  11.   

    例子类:
    public class File {    public native String getStringItem();    static {
            System.loadLibrary("File");
        }
    }用命令行生成C的头文件(先编译,com.test.jni是包名,例子,然后再生成头文件)。javac com/test/jni/File.java
    javah -jni com.test.jni.File引用头文件,写c/c++代码,然后生成libFile.so文件(例子,lib是前缀,不可少)
    创建android工程,在根目录下创建libs文件夹,在libs文件夹下创建armeabi文件夹,
    将libFile.so文件放在armeabi文件夹下。最后,正常调用File类的方法。
      

  12.   


    你看下android核心块全是用jni的。。