当前位置:编程学习 > wap >>

如何将底层C++库包装成Java类供上层APP调用?(就像使用Android SDK一样)

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

--------------------编程问答-------------------- 尝试使用JNI的方法调用。

没有试过,不知道结果会怎么样。 --------------------编程问答-------------------- 使用jni就可以实现的,具体可以参考一下android的源代码. --------------------编程问答-------------------- 扩充Framework , 利用JNI , 调用本地实现库 --------------------编程问答-------------------- 既然要用底层的c 为什么不直接使用ndk开发? 
如果在app层频繁使用java封装的API 用jni函数调用底层的c 并不是一个很有效率的做法 
就像你说的file 既然c给你了file 你就直接写c去用file不就好了 
我觉得 尽量避免频繁使用jni调用c code  
jni的效率真的不高 --------------------编程问答-------------------- 两种方案:
1.如楼上诸位所说,将其加入到framework中,通过jni方式调用。
2.使用System.loadLibrary(...),在程序中加载so库,直接调用其中的api。 --------------------编程问答--------------------
引用 5 楼 yyy025025025 的回复:
两种方案:
1.如楼上诸位所说,将其加入到framework中,通过jni方式调用。
2.使用System.loadLibrary(...),在程序中加载so库,直接调用其中的api。


你好:
    小弟新手。最近也在做这方面的研究。想问一下,这个两个方法有什么本质的不同吗?方法2不需要JNI 来封装一下吗?可以直接调用吗? --------------------编程问答--------------------
引用 4 楼 standatw 的回复:
既然要用底层的c 为什么不直接使用ndk开发? 
如果在app层频繁使用java封装的API 用jni函数调用底层的c 并不是一个很有效率的做法 
就像你说的file 既然c给你了file 你就直接写c去用file不就好了 
我觉得 尽量避免频繁使用jni调用c code  
jni的效率真的不高


ndk也是用的jni吧 --------------------编程问答-------------------- 关键看做什么了,要从本质来看,你要知道c到底哪些比java有优势,比如数学运算,效率敏感的操作,因为有指针,内存可以手动的控制,对于文件读写方面其实 java 运行库也是底层的c,所以意义不大,jni执行次消耗不小的 --------------------编程问答-------------------- 恩 我的意思是 用jni把c封装成api使用 不如把所有可以用c处理的用ndk实现 不需要再自己添加api 个人意见

引用 7 楼 kenshintang1215 的回复:
引用 4 楼 standatw 的回复:

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


ndk也是用的jni吧
--------------------编程问答-------------------- google并不想维护多种api,ndk本身就支持c和c++以及数学库,部分socket以及opengl库,需要了自己可以添加,但ui是java写的,没啥好办法,自己diy吧 --------------------编程问答-------------------- 以下是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 !");
}

--------------------编程问答--------------------
引用 6 楼 xsun33 的回复:
引用 5 楼 yyy025025025 的回复:

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


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

请大家回答一些这两个问题。 --------------------编程问答--------------------
引用 12 楼 lhllhl 的回复:
引用 6 楼 xsun33 的回复:
引用 5 楼 yyy025025025 的回复:

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


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

请大家回答一下这两个关键问题 --------------------编程问答--------------------
引用 13 楼 lhllhl 的回复:
引用 12 楼 lhllhl 的回复:
引用 6 楼 xsun33 的回复:
引用 5 楼 yyy025025025 的回复:

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


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


请大家回答一下这两个关键问题
--------------------编程问答--------------------
引用 11 楼 wangzi7745453 的回复:
以下是JNI 的实现步骤:
1. 编写带有native 声明的方法的java 类
2. 使用javac 命令编译所编写的java 类
3. 使用javah ?jni java 类名生成扩展名为h 的头文件
4. 使用C/C++实现本地方法
5. 将C/C++编写的文件生成动态连接库

其实使用原生代码(C,C++)是很有用的,比如高性能和高保密的应用逻辑用C开发,可以提高效率,可重用……



说的很好 --------------------编程问答-------------------- 例子类:
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类的方法。
--------------------编程问答--------------------
引用 4 楼 standatw 的回复:
既然要用底层的c 为什么不直接使用ndk开发? 
如果在app层频繁使用java封装的API 用jni函数调用底层的c 并不是一个很有效率的做法 
就像你说的file 既然c给你了file 你就直接写c去用file不就好了 
我觉得 尽量避免频繁使用jni调用c code  
jni的效率真的不高


你看下android核心块全是用jni的。。
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,