Ⅰ linux C有個死循環返回 jni怎麼寫
在一個死循環中返回:
for (;;)
{
/* ... do something */
return "jni";
}
Ⅱ linux中JNI的no HelloWorld in java library path怎麼解決
我也遇到了一樣的問題 折騰了好久 終於弄清楚了
先找到java.library.path的路徑,用程序輸出System.out.println(Syetem,getProperty("java.library.path"));
之後將libXXX.so復制到上一步輸出的路徑中,之後再loadLibrary(XXX)
運行後就沒有問題了
Ⅲ linux Jni調用so文件建了測試WebProject 寫了一個servlet執行調用 一啟動tomcat jvm崩潰了 錯誤日誌如下
你的jvm崩潰應該是由於你的C/C++代碼而不是java代碼
你在tomcat上跑是單線程訪問還是多線程訪問,你的測試類應該是寫的單線程吧,改成多線程測測看
Ⅳ jni.h windows和linux的區別
兩個完全不同的os,磁碟管理方式不同,掛載點取代了c,d,e盤。許可權管理不同,linux的root的許可權遠大於windows的管理員。windows整個是一個整體,linux是一個內核加上一堆基礎應用拼出來的
Ⅳ Linux下NDK編譯出的SO庫能在WIndows下的android工程直接使用么
是在windows下做開發的,但是編譯環境還是在linux上。。大體的步驟如下:
1.首先在windows環境下編寫工程(eclipse下編寫android工程)
2.打開linux開發環境(tcl平台:\\10.120.90.207\longc\workspace\code\project\kernel\android\JB)
3.將運行環境的腳本文件運行./evnsetup:配置android運行環境
/JB/build/
找到envsetup.sh
運行.envsetup.sh(source envsetup.h或./envsetup)
所有操作都在終端完成
4.將工程文件拷貝到指定目錄下(TCL平台下的自帶程序在package\TCL_Apps目錄下)
5.刪除一些文件
保留/res,/src,AndroidManifest.xml三個文件
創建Android.mk(makefile文件,linux下用makefile文件來集成一些命令,運行程序的指令和設置都在此處)Android.mk的編寫
6.編譯
進入工程文件目錄
輸入mm命令進行編譯。
7.生成apk文件,編譯完成
Ⅵ 如何在linux下創建一個簡單的JNI程序HelloWorld
JNI全名是Java Native Interface,通過JNI技術可以實現Java和其他編程語言的互相調用。這里我們使用的是Java和C的互相調用,Java提供本地介面,C實現該本地介面。
我使用的是RHEL 5,主要是為了測試一下在Linux平台下,了解JNI技術是如何實現的。通過一個HelloWorld實例,具體過程在下面講解。
首先,實現的是Java本地介面Hello.java,代碼如下所示:
classHelloWorld{
publicnativevoidsayHello();
static{
System.loadLibrary("HelloWorld");
}
publicstaticvoidmain(String[]args){
(newHelloWorld()).sayHello();
}
}
其中,方法聲明為native,其實HelloWorld類就相當於一個介面,是為其他編程語言聲明的介面。System.loadLibrary("HelloWorld");語句是一個static塊,也就是在該HelloWorld類載入的時候進行執行。其中,該語句實現了載入本地的動態連接庫(DLL),在Linux平台下,動態連接庫文件是以.so作為擴展名的,也就是標准對象(Standard Object)。
對該本地介面類進行編譯:
[root@localhost jni]# javac HelloWorld.java
接著,通過編譯的HelloWorld.class文件,生成C語言的頭文件,執行命令:
[root@localhost jni]# javah -jni HelloWorld
可以看到,在當前目錄下生成一個HelloWorld.h文件,該文件就是C的介面文件,為使用C實現Java介面中定義的方法,可以發現在HelloWorld.h中有一個方法聲明:
#ifndef__HelloWorld__
#define__HelloWorld__
#include<jni.h>
#ifdef__cplusplus
extern"C"
{
#endif
JNIEXPORTvoidJNICALLJava_HelloWorld_sayHello(JNIEnv*env,jobject);
#ifdef__cplusplus
}
#endif
#endif/*__HelloWorld__*/
然後,用C實現該方法,在HelloWorld.c文件中,代碼如下:
#include<jni.h>
#include"HelloWorld.h"
#include<stdio.h>
JNIEXPORTvoidJNICALLJava_HelloWorld_sayHello(JNIEnv*env,jobjectobj){
printf("Hello,theWorld!!!");
}
這里,方法簽名為Java_HelloWorld_sayHello (JNIEnv *env, jobject obj),添加了形參obj,否則無法通過編譯。
接下來,生成動態連接庫libHelloWorld.so,執行命令:
[root@localhost jni]# gcc -fPIC -shared -o libHelloWorld.so HelloWorld.c
可以在當前目錄下看到libHelloWorld.so,動態連接庫文件名稱以lib開頭。將該文件拷貝到usr/lib目錄下面,就可以測試了。
現在執行如下命令進行測試:
[root@localhost jni]# java HelloWorld
輸出如下:
Hello,the World!!!
這只是一個非常簡單的例子,主要是了解JNI在Linux下該如何用。在實際應用中,可能會非常復雜,並且要記住,一旦使用了JNI技術,系統的可移植性被破壞了。有些應用中,正是基於這種特性實現,比如限制軟體的傳播使用,保護開發商權益,等等。
Ⅶ LINUX環境C++動態鏈接庫如何才能被C應用程
的(在WINDOWS平台上是DLL文件形式,在UNIX機器上是SO文件形式)。
如下是詳細講解:
1、JAVA中所需要做的工作
在JAVA程序中,首先需要在類中聲明所調用的庫名稱,如下:
static {
System.loadLibrary(「goodluck」);
}
在這里,庫的擴展名字可以不用寫出來,究竟是DLL還是SO,由系統自己判斷。
還需要對將要調用的方法做本地聲明,關鍵字為native。並且只需要聲明,而不需要具體實現。如下:
public native static void set(int i);
public native static int get();
然後編譯該JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就會生成C/C++的頭文件。
例如程序TestDll.java,內容為:
public class TestDll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
TestDll test = new TestDll();
test.set(10);
System.out.println(test.get());
}
}
用javac TestDll.java編譯它,會生成TestDll.class。
再用javah TestDll,則會在當前目錄下生成TestDll.h文件,這個文件需要被C/C++程序調用來生成所需的庫文件。
2、C/C++中所需要做的工作
對於已生成的.h頭文件,C/C++所需要做的,就是把它的各個方法具體的實現。然後編譯連接成庫文件即可。再把庫文件拷貝到JAVA程序的路徑下面,就可以用JAVA調用C/C++所實現的功能了。
接上例子。我們先看一下TestDll.h文件的內容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class TestDll */
#ifndef _Included_TestDll
#define _Included_TestDll
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_TestDll_get (JNIEnv *, jclass);
JNIEXPORT void JNICALL Java_TestDll_set (JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
在具體實現的時候,我們只關心兩個函數原型
JNIEXPORT jint JNICALL Java_TestDll_get (JNIEnv *, jclass);
和
JNIEXPORT void JNICALL Java_TestDll_set (JNIEnv *, jclass, jint);
這里JNIEXPORT和JNICALL都是JNI的關鍵字,表示此函數是要被JNI調用的。而jint是以JNI為中介使JAVA的int類型與本地的int溝通的一種類型,我們可以視而不見,就當做int使用。函數的名稱是JAVA_再加上java程序的package路徑再加函數名組成的。參數中,我們也只需要關心在JAVA程序中存在的參數,至於JNIEnv*和jclass我們一般沒有必要去碰它。
下面我們用TestDll.cpp文件具體實現這兩個函數:
#include "TestDll.h"
int i = 0;
JNIEXPORT jint JNICALL Java_TestDll_get (JNIEnv *, jclass)
{
return i;
}
JNIEXPORT void JNICALL Java_TestDll_set (JNIEnv *, jclass, jint j)
{
i = j;
}
編譯連接成庫文件,本例是在WINDOWS下做的,生成的是DLL文件。並且名稱要與JAVA中需要調用的一致,這里就是goodluck.dll
把goodluck.dll拷貝到TestDll.class的目錄下,java TestDll運行它,就可以觀察到結果了。
3、你想保存一個"\sample\myfile.txt"到變數str中,原本就要寫成
Ⅷ Linux下NDK編譯出的SO庫能在WIndows下的android工程直接使用么
可以直接在android工程下使用,因為android就是linux內核。
1.android的NDK開發需要在linux下進行: 因為需要把C/C++編寫的代碼生成能在arm上運行的.so文件,這就需要用到交叉編譯環境,而交叉編譯需要在linux系統下才能完成。
2.安裝android-ndk開發包,這個開發包可以在google android 官網下載: 通過這個開發包的工具才能將android jni 的C/C++的代碼編譯成庫
3.android應用程序開發環境: 包括eclipse、java、 android sdk、 adt等。
NDK編譯步驟:
1.選擇 ndk 自帶的例子 hello-jni ,位於E:\android-ndk-r5\samples\hello-jni( 根據具體的安裝位置而定 ) 。
2.運行 cygwin ,輸入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,進入到 E:\android-ndk-r5\samples\hello-jni 目錄。
3.輸入 $NDK/ndk-build ,執行成功後,它會自動生成一個 libs 目錄,把編譯生成的 .so 文件放在裡面。 ($NDK是調用我們之前配置好的環境變數, ndk-build 是調用 ndk 的編譯程序 )
4.此時去 hello-jni 的 libs 目錄下看有沒有生成的 .so 文件,如果有,ndk 就運行正常啦。
Ⅸ android studio jni調用linux下的C代碼工程
http://blog.csdn.net/sodino/article/details/41946607