【求妖哥出山】老妖帮忙啊:c++builder在安卓下如何调用第三方JAR?

ysyzqm-zqm 2015-01-07 10:31:56
翻遍浏览器的每一个角落,蛛丝马迹都没有,只有请妖哥出山了,c++builder在安卓下如何调用第三方JAR?
...全文
623 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tccsdn 2015-06-26
  • 打赏
  • 举报
回复
想不到BCB现在这么强大了
ysyzqm-zqm 2015-01-28
  • 打赏
  • 举报
回复
JNIEnv* env;  
jclass cls;//对用java的Class  
jobject obj;  
jmethodID mid;//映射方法  
//构建一个Class  
cls = jniEnv->FindClass("com/ndk/testndk/TestHello");//写上类的路径  
//实例化对象  
//方法一  
obj = env->AllocObject(cls);  
//方法二  
jmethodID obj_id = env->GetMethodID(cls,"<init>", "()V");  
TestProvider mTestProvider = env->NewObject(cls,obj_id);  
//映射方法  
//其中"()Ljava/lang/String;",括号是参数,Ljava/lang/String;是返回值,如有参数string,即为"(Ljava/lang/String;)Ljava/lang/String;"  
//静态  
mid = env->GetStaticMethodID(cls, "getStaticString","()Ljava/lang/String;");  
//非静态  
mid = env->GetMethodID(cls, "getString","()Ljava/lang/String;");  
//调用方法  
//静态:  
env->CallStaticObjectMethod(cls, mid);  
//非静态:  
env->CallVoidMethod(obj, mid,jstr);  
</init>  
//-----------------开始写代码-----------------------------------------------------------------------------
[java] view plaincopy在CODE上查看代码片派生到我的代码片
//java部分  
public class TestHello2 {  
    public static String getStaticString(){  
        return "Java静态的返回值";  
    }  
      
    public String getString(String str){  
        str += ",还有非静态的。";  
        Log.e("", str);  
        return str;  
    }  
}  
//C++部分  
jstring Java_com_ndk_testndk_TestHello_jnistr(JNIEnv* env,jobject obj){  
    jclass cls = env->FindClass("com/ndk/testndk/TestHello2");  
    jobject obj1 = env->AllocObject(cls);  
    jmethodID mid1 = env->GetStaticMethodID(cls, "getStaticString","()Ljava/lang/String;");  
    jmethodID mid2 = env->GetMethodID(cls, "getString","(Ljava/lang/String;)Ljava/lang/String;");  
    //静态:  
    jstring jstr = (jstring) env->CallStaticObjectMethod(cls, mid1);  
    //非静态:  
    jstring jstr2 = (jstring) env->CallObjectMethod(obj1, mid2,jstr);  
    return jstr2;  
}  
ysyzqm-zqm 2015-01-28
  • 打赏
  • 举报
回复
刚研究了java与C++的相互调用,赶紧记录下来。。。 一、java调用C++ 要想让java调用C++,必须让C++函数按着命名规则来。命名规则为 返回值 Java_包路径_类名_函数名(JNIEnv* env,jobject obj);对应如下: jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj); 其中第二个参数为该类的对象,也就是TestHello的对象 例子如下: [java] view plaincopy在CODE上查看代码片派生到我的代码片 //java代码 public class TestHello { public native String jnia(); static { // 加载libAppConfig.so库文件 // AppConfig是添加 Android Native Support时输入的名称 // 另外,通过修改Android.mk中的LOCAL_MODULE可以修改这个名称 System.loadLibrary("TestNDK"); } } //C++代码 #include <string h=""> #include <jni h=""> #include <android log="" h=""> #include "TestNDK.h" #ifdef __cplusplus //最好有这个,否则被编译器改了函数名字找不到不要怪我 extern "C" { #endif jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj){ return 12; } #ifdef __cplusplus } #endif </android></jni></string> 二、C++调用java C++调用java就会比较复杂了,先来了解一下基本的语法吧! [java] view plaincopy在CODE上查看代码片派生到我的代码片 JNIEnv* env; jclass cls;//对用java的Class jobject obj; jmethodID mid;//映射方法 //构建一个Class cls = jniEnv->FindClass("com/ndk/testndk/TestHello");//写上类的路径 //实例化对象 //方法一 obj = env->AllocObject(cls); //方法二 jmethodID obj_id = env->GetMethodID(cls,"<init>", "()V"); TestProvider mTestProvider = env->NewObject(cls,obj_id); //映射方法 //其中"()Ljava/lang/String;",括号是参数,Ljava/lang/String;是返回值,如有参数string,即为"(Ljava/lang/String;)Ljava/lang/String;" //静态 mid = env->GetStaticMethodID(cls, "getStaticString","()Ljava/lang/String;"); //非静态 mid = env->GetMethodID(cls, "getString","()Ljava/lang/String;"); //调用方法 //静态: env->CallStaticObjectMethod(cls, mid); //非静态: env->CallVoidMethod(obj, mid,jstr); </init> //-----------------开始写代码----------------------------------------------------------------------------- [java] view plaincopy在CODE上查看代码片派生到我的代码片 //java部分 public class TestHello2 { public static String getStaticString(){ return "Java静态的返回值"; } public String getString(String str){ str += ",还有非静态的。"; Log.e("", str); return str; } } //C++部分 jstring Java_com_ndk_testndk_TestHello_jnistr(JNIEnv* env,jobject obj){ jclass cls = env->FindClass("com/ndk/testndk/TestHello2"); jobject obj1 = env->AllocObject(cls); jmethodID mid1 = env->GetStaticMethodID(cls, "getStaticString","()Ljava/lang/String;"); jmethodID mid2 = env->GetMethodID(cls, "getString","(Ljava/lang/String;)Ljava/lang/String;"); //静态: jstring jstr = (jstring) env->CallStaticObjectMethod(cls, mid1); //非静态: jstring jstr2 = (jstring) env->CallObjectMethod(obj1, mid2,jstr); return jstr2; } getStaticMethodInfo和getMethodInfo的最后一个参数如下图 以下是一些易犯的错误整理: 1.在java函数若是String型的,在jni调用是传参必须是env->NewStringUTF("这是字符串") Demo下载地址:http://download.csdn.net/detail/super_level/7041419
ysyzqm-zqm 2015-01-28
  • 打赏
  • 举报
回复
谢谢大家,结贴,如果调试成功,我就放到论坛里,先把别人写的c++调用Java的例子放到这里供大家参考
引用
http://blog.csdn.net/super_level/article/details/21238817
ccrun.com 2015-01-23
  • 打赏
  • 举报
回复
Jni.hpp 就是他了。
ysyzqm-zqm 2015-01-22
  • 打赏
  • 举报
回复
没找到jni.h,发现了这个,这个文件是吗?
ysyzqm-zqm 2015-01-22
  • 打赏
  • 举报
回复
引用 4 楼 mengge 的回复:
realbay琢磨出来了: http://blog.csdn.net/realbay/article/details/42587705
这个方法有局限性,复杂的jar调用不成功,已测试了
踏岸寻柳 2015-01-16
  • 打赏
  • 举报
回复
realbay琢磨出来了: http://blog.csdn.net/realbay/article/details/42587705
ccrun.com 2015-01-16
  • 打赏
  • 举报
回复
让 realbay 来这个帖子回复一下,然后楼主结帖把分给了 realbay 就行了。
ysyzqm-zqm 2015-01-14
  • 打赏
  • 举报
回复
谢谢冬瓜猫,我在一直研究动态调用.jar的例子,论坛里已经有人研究出来了静态调用的例子了
过客猫2022 2015-01-13
  • 打赏
  • 举报
回复
你看看C++Builder有没有包含java需要的头文件,jni.h,如果有的话,那就简单了。你可以参考网上大把通过jni调用c++或调用java的例子
ccrun.com 2015-01-08
  • 打赏
  • 举报
回复
用C++Builder开发Android应用,目前我只接触了一小部分,暂时没有用到调用第三方JAR的功能,帮不上你,实在抱歉了。

552

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧